當前位置:首頁 » 編程語言 » c語言線程和進程
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言線程和進程

發布時間: 2023-02-04 16:14:24

⑴ linux下c語言編程線程有什麼好處呢

進程和線程都是由操作系統所體會的程序運行的基本單元,系統利用該基本單元實現系統對應用的並發性。進程和線程的區別在於:

線程的劃分尺度小於進程,使得多線程程序的並發性搞。

另外,進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程序的運行效率。

線程在執行過程中與進程還是有區別的。每個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。但是線程不能夠獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。

從邏輯角度來看,多線程的意義在於一個應用程序中,有多個執行部分可以同時執行。但操作系統並沒有將多個線程看做多個獨立的應用,來實現進程的調度和管理以及資源分配。這就是進程和線程的重要區別。

進程(Process)是最初定義在Unix等多用戶、多任務操作系統環境下用於表示應用程序在內存環境中基本執行單元的概念。以Unix操作系統為例,進程是Unix操作系統環境中的基本成分、是系統資源分配的基本單位。Unix操作系統中完成的幾乎所有用戶管理和資源分配等工作都是通過操作系統對應用程序進程的控制來實現的。

一般你運行一個應用程序,就生成了一個進程, 這個進程擁有自己的內存空間,

這個進程還可以內部生成多個線程, 這些線程之間共用一個進程的內存空存空間,所以線程之間共享內存是很容易做到的,多線程協作比多進程協作快一些,而且安全.

在windows跟unix上面,進程,線程的實現方法都是不一樣的.

⑵ C語言如何讓結束指定進程中的指定線程

終止線程有三種方法:
1.線程可以在自身內部調用AfxEndThread()來終止自身的運行
2.可以在線程的外部調用BOOL TerminateThread( HANDLE hThread, DWORD dwExitCode )來強行終止一個線程的運行,
然後調用CloseHandle()函數釋放線程所佔用的堆棧
3.第三種方法是改變全局變數,使線程的執行函數返回,則該線程終止。

unsigned long __cdecl _beginthread (void (__cdecl *) (void *),
unsigned, void *); PS--這是我復制的別人的

⑶ C語言創建線程或者子進程後要用if else

fork 是用來創建子進程的, 而不是線程( 線程創建需要用到 pthread_create )

需要根據 fork() 的返回值來判斷下面的代碼是在父進程(返回pid>0)中還是子進程(返回0)中. 像上面的代碼中 if 中的代碼被在子進程中執行, else 中的代碼在父進程中執行.

⑷ C語言的代碼執行過程中,整個代碼運行過程是一個進程,而其中每一條語句和操作是一個線程么

操作系統中的多線程和多進程是需要通過編程實現的,需要寫程序時通過函數去創建進程或者線程。如果只是一個普通方式寫的C語言程序只是一個線程或者進程而已

⑸ C語言中 怎麼實現雙線程 或者 父子線程啊

運行一個程序,這個運行實體就是一個「進程」。

例如,用滑鼠雙擊IE瀏覽器的圖標,你運行了一個IE「進程」。第一個窗未關,你又用滑鼠雙擊IE瀏覽器的圖標,又出來一個瀏覽器的窗。這時,你運行了同一個程序的兩個進程。

對於自己寫的程序也如此。運行它,這個運行實體就是一個「進程」。同時運行兩個,就是兩個進程。計算機分別對兩個進程分配資源,直到進程結束,收回資源。

線程是進程里真真跑的線路,真真執行的運算,每個進程有一個主線程。進程里可以開第二第三條新的執行線路,gcc 用 pthread_create(),VC++ 用 CreateThread(), 這就叫雙線程和多線程。進程是線程的容器,同一進程的線程共享它們進程的資源。線程里建的線程就是父子線程。

兩個或多個進程協同工作時,需要互相交換信息,有些情況下進程間交換的少量信息,有些情況下進程間交換大批信息。這就要通訊。通訊方式不止一種。管道就是一種。VC++ 用 CreatePipe() 函數建立。

管道的實質是一個共享文件,可藉助於文件系統的機制實現,創建、打開、關閉和讀寫.

一個進程正在使用某個管道寫入或讀出數據時,另一個進程就必須等待. 發送者和接收者雙方必須知道對方是否存在,如果對方已經不存在,就沒有必要再發送信息.,發送信息和接收信息之間要協調,當寫進程把一定數量的數據寫入管道,就去睡眠等待,直到讀進程取走數據後,把它喚醒。

VC++ 線程例子:
#include <windows.h>
#include <iostream.h>

DWORD WINAPI fun1(LPVOID lp);
DWORD WINAPI fun2(LPVOID lp);
int piao=500;

int main()
{
HANDLE pthread1,pthread2;
pthread1=CreateThread(0,0,fun1,0,0,0);
pthread2=CreateThread(0,0,fun2,0,0,0);
CloseHandle(pthread1);
CloseHandle(pthread2);
Sleep(3000);
return 0;

}

DWORD WINAPI fun1(LPVOID lp)
{
while(1)
{

if(piao>0)
cout<< "thread-1-"<< piao--<<endl;
else
break;
}
return 0;
}

DWORD WINAPI fun2(LPVOID lp)
{
while(1)
{
if(piao>0)
cout<<"thread-2-"<<piao--<<endl;
else
break;
}
return 0;
}

===================================
建管道函數原形:
BOOL CreatePipe(
PHANDLE hReadPipe, // read handle
PHANDLE hWritePipe, // write handle
LPSECURITY_ATTRIBUTES lpPipeAttributes, // security attributes
DWORD nSize // pipe size
);

⑹ c語言怎麼創建線程和使用

進程的生命周期:
[1].創建 --- fork
[2].執行 --- a. exec
b.子進程實現代碼邏輯
[3].結束 --- exit _exit
僵屍態進程---wait waitpid
孤兒進程
--------------------------------------
進程存在的問題:
(1).進程的創建 --- 復制
(時間 和 空間的開銷很大)
(2).進程的運行 --- 調度-->

⑺ C語言中如何讓線程等待進程執行完一部分後,線程再繼續執行

#include"afxmt.h"
//全局變數
CEventevent(FALSE,TRUE);//第二個參數為TRUE表示手動信號
event.SetEvent();
//線程中要等待的地方
WaitForSingleObject(event,INFINITE)//永遠等待
......//線程中的代碼
event.ResetEvent();//線程掛起
//-----------------------------------------------------
//以上代碼C好像不行,可以用笨辦法
//定義一個全局標識變數intflag=0;
//在線程中
while(flag==0)//在主線程中改變flag的值,一旦不為0,則執行線程中的代碼
{
Sleep(1);
}
......//線程要執行的功能

⑻ c語言線程問題,在不影響目的的情況下修改

所謂worker 線程,是指完全不牽扯到圖形用戶界面(GUI),純粹做運算的
:你不可以依賴「因線程的結束而清理所有被這一線程產生的核心對象」。許多對象,例如文件,是被進程擁有,而非被線程擁有。
在進程結束之前不能夠清理它們。
CloseHandle( )唯一做的事情就是把引用計數減1。如果該值變成0,對象會自動被操作系統摧毀。
Win32 說明文件一再強調線程分為GUI 線程和worker 線程兩種。GUI 線程負責建造窗口以及處理主消息循環。worker 負責執行純粹運算工作,如重新
計算或重新編頁等等,它們會導致主線程的消息隊列失去反應。一般而言,GUI
線程絕不會去做那些不能夠馬上完成的工作。
1. 各線程的數據要分離開來,避免使用全局變數。2. 不要在線程之間共享GDI 對象。
3. 確定你知道你的線程狀態。不要徑自結束程序而不等待它們的結束。
4. 讓主線程處理用戶界面(UI)。

這是我在看完一本線程的書,然後寫的

具體你的主要問題是:不要試圖讓回答你的問題 的人來給你找問題,你得自己找出問題,或哪裡輸出不對,然後再問
-物聯網校企聯盟技術部