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

c語言編譯器可以多線程

發布時間: 2023-07-30 03:13:24

c語言實現多線程

目錄:

  1. Linux操作系統,C語言實現多線程

  2. Windows操作系統,C語言實現多線程

  3. Windows下的多線程(不帶停止)

Linux操作系統,C語言實現多線程:

#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
void*ThreadOne(void*threadArg)
{
printf("線程開始啦,參數是:%s ",(char*)threadArg);
returnNULL;
}
intmain(void)
{
pthread_tThreadID;/*記錄線程標識符*/
void*waitingResult;/*等待線程退出的等待結果*/
interrorCode;/*記錄線程的錯誤代碼*/
char*aMessage="這是線程的參數";
/*創建並啟動線程ThreadOne。若返回值非零,則線程創建失敗*/
errorCode=pthread_create(&ThreadID,NULL,ThreadOne,aMessage);
if(errorCode!=0)
{
printf("線程ThreadOne創建失敗。錯誤代碼:%d ",errorCode);
returnEXIT_FAILURE;
}
/*等待線程標識符為的ThreadID的線程結束*/
errorCode=pthread_join(ThreadID,&waitingResult);
if(errorCode!=0)
{
printf("等待線程退出等待失敗。錯誤代碼:%d ",errorCode);
returnEXIT_FAILURE;
}
printf("線程的返回值是%p ",waitingResult);
returnEXIT_SUCCESS;
}

Windows操作系統,C語言實現多線程:

#include<stdio.h>
#include<windows.h>
DWORDAPIENTRYThreadOne(LPVOIDthreadArg)
{
printf("線程開始啦,參數是:%s ",(char*)threadArg);
return0;
}
intmain(void)
{
HANDLEhThread;/*記錄線程句柄*/
DWORDThreadID;/*記錄線程ID號*/
DWORDwaitingResult;/*等待線程退出的等待結果*/
DWORDthreadExitCode;/*記錄線程的返回值*/
char*aMessage="這是線程的參數";
/*創建並啟動線程ThreadOne,返回值為線程句柄,賦值給hThread*/
hThread=CreateThread(NULL,0L,ThreadOne,(LPVOID)aMessage,0L,&ThreadID);
if(hThread==NULL)
{
printf("線程ThreadOne創建失敗。錯誤代碼:%lu ",GetLastError());
returnEXIT_FAILURE;
}
/*等待線程句柄為的hThread線程結束*/
waitingResult=WaitForSingleObject(hThread,INFINITE);
if(waitingResult==WAIT_FAILED)
{
printf("等待線程退出等待失敗。錯誤代碼:%lu ",GetLastError());
returnEXIT_FAILURE;
}
if(GetExitCodeThread(hThread,&threadExitCode))
printf("線程的返回值是%lu ",threadExitCode);
else
printf("獲取線程的返回值獲取失敗。錯誤代碼:%lu ",GetLastError());
returnEXIT_SUCCESS;
}

Windows下的多線程:(不帶停止)

#include<stdio.h>
#include<windows.h>
DWORDWINAPIoxianchen(LPVOIDlpParam);
intmain(intargc,char*argv[])
{
intnum=0;
CreateThread(NULL,NULL,oxianchen,&num,NULL,NULL);
while(1)
{
num++;
printf("主線程!%05d ",nu***eep(40);
}
return0;
}
DWORDWINAPIoxianchen(LPVOIDlpParam)
{
int*a=lpParam;
while(1)
{
++*a;
printf("副線程!%05d0x%p ",*a,a);
Sleep(80);
}
return0;
}

Ⅱ C語言能實現多線程么

可以通過調用C語言函數庫pthread里的函數,創建多線程。

多線程是指程序中包含多個執行流,即在一個程序中可以同時運行棚悉多個不同的線程來執行不同的任務,也就是說允許單個程序創建多個並行執行的線程來完成各自的任務。

C語言最初並未設鏈肢乎計多線程的機制,隨著飢棚軟硬體的發展及需求的發展,C語言才開發了線程庫以支持多線程的操作和應用。

Ⅲ C語言怎樣實現多線程

首先你要有控制蛇移動方向的全局變數(定義在main以外因為線程函數也要調用它,每次鍵盤輸入都會修改它的值), 比如 char direction 'a' ==左 'w' == 右 'd'==上 's' == 下,然後你在移動時應該是在while裡面操作的吧,你每移動一步前都讀一下direction這個變數的數值然後再控制移動方向(注意s這個鍵可以忽略因為不會倒著走) 然後你可以用pthread.h這個庫 例子是 pthread t;// 定義一個線程 pthread_create(&t, null, listen_keyboard_input, null);//建立線程執行listen_keyboard_input這個函數 這個線程執行的函數 void listen_keyboard_input(){ while(應該通過某個信號來退出這個循環,從而表示游戲結束){ direction =getchar(); } } 但是這里存在同步問題, 比如當這個線程的getchar()在給direction輔助的同時,你控制貪吃蛇移動的線程正在調用 direction的值來判斷下一個移動方向,這就會出問題,所以要加一個鎖,叫 mutex lock;這個也定義成全局變數可以使各線程共享。 pthread_mutex_t mutex; //定義一個鎖 pthread_mutex_init(&mutex, null, null);//初始化 然後把函數修改成 void listen_keyboard_input(){ while(應該通過某個信號來退出這個循環,從而表示游戲結束){ pthread_mutex_lock(&mutex); direction =getchar(); pthread_mutex_unlock(&mutex); } } 另外一個控制貪吃蛇移動的時候也要加鎖 while(.....){ char c; pthread_mutex_lock(&mutex); c = direction; pthread_mutex_unlock(&mutex); switch(c){ ................ } ................................... } 這樣就好了 注意你的控制貪吃蛇移動的部分也必須要放在另外一個pthread 裡面執行,如果放在主線程, 主線程會一直等listen_keyboard_input而什麼事都不會做 你把這兩個線程用 pthread_create 創建完成後 用 t1.join(); t2.join(); 就可以使這兩個線程並發執行了 如果你用的是linux 來編譯的,你再輸入gcc 指令後加上 -lpthread 就可以了 還有什麼不懂的你可以多找找 pthread 類的例子

Ⅳ C語言基礎網路編程求助 如何實現多線程

#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

void*thread(void*);
int client[5],i;

main()
{
int serverSocket= socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in server_addr;
struct sockaddr_in clientAddr;
int addr_len = sizeof(clientAddr);
//線程
pthread_t id;
pthread_attr_t attr;
pthread_attr_init(&attr);////////////////////////////////////////////////
pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);
//創建地址
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family =AF_INET;
server_addr.sin_port = htons(5555);
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
//綁定
bind(serverSocket,(struct sockaddr *)&server_addr,sizeof(server_addr));
listen(serverSocket,5);
for(i=0;i<5;i++)
{
client[i] = accept(serverSocket,(struct sockaddr *)&clientAddr,(socklen_t*)&addr_len);
pthread_create(&id,&attr,thread,(void *)&client[i]);/////////////////////////////////
pthread_join(id,NULL);
}
close(serverSocket);/////////////////////////
return 0;
}
void* thread(void* argv)
{
char buffer[200];
int a=i;
int s_c = *((int*)argv);///////////////////
while(1)
{
int n = recv(s_c,buffer,sizeof(buffer),0);
if(n > 0)
printf("客戶端發過來的 : %s\n",buffer);
else
return;
}
close(s_c);
}

Ⅳ C語言可以實現 中斷 和 多線程 這類功能嗎

「暈,C語言不是灰常強大,無所不能嗎?怎麼有人說C語言不能實現 中斷 和多線程??」這句話要分兩部分來說,首先「暈,C語言不是灰常余殲昌強大,無所不能嗎?」。沒有任何一種語言可以無所不能,原因很簡單,任何的語言都脫離不了編譯工具,而編譯工具脫離不了編譯環境。由於編譯環境的不同,因此編譯工具也有所不同,有得只針對JAVA,有得指針對C++,有得只針對C#。不管C語言多厲害,如果編譯工具不支持,那也沒有辦法在這個編譯工具上編譯,以至於沒有辦法在那個編譯工具的編譯環境中運行。所以不能說無所不能。
「怎麼有人說C語言不能實現改激 中斷 和多線程啊」,這是一個概念性問題。純粹的C語言只是一個工具,更多的是一種定義,一種格式,可以抽象成一種風格。就像定義一個整型變數i。為什麼你不能用integer i定義,非得int i。例如函數的編寫形式,命名規則等等。假如按照C語言的這些規則來編寫程序,同時編譯工具支持C語言,提供中斷庫,還有多線程庫,那麼C語言同樣也可以實現中斷和多線程。舉個例子:例如你手頭上只有一個TC編譯工具,雖然他支持C語言,但是只能編譯16位的DOS程序,礙於這個編譯工具的局限性,所以你永遠也寫不出像Windows操作系統那種帶窗口界面的Win32程序,也不能寫一個針對.NET框架的網路服務程序。同樣的,假如你要開發一個Windows軟體,使用VC編譯器,而這個編譯工具本身帶多線程庫,同時支持Windows系統的很多調用,所以你完全可以以C語言的風格在這個編譯器中調用各種Win32 SDK,開發一個多線程的Windows應用程序。假如你要使用中斷,在Windows環境下可以使用微軟提供的DDK(驅動開發包),他同樣支持C語言,那麼你就可以通過這個開發包調用很多中斷。在Linux環境下,不需要開發包就可以直接調用,因為Linux自帶了很多系統調用都是開放的。頭文件聲明直接就在Linux文件系統的Sys目錄下。所以說他僅僅是一種風格。依賴於編譯環境的系統調用同樣也依賴於編譯環境提供的鏈接豎扒庫。

Ⅵ [高分,急]C語言,如何實現多線程,有具體方案,請提供!

你這個問題可是超過200分的啊,
這個往大了說是一個比較復雜的設計方案。

實際上C語言是沒有多線程的概念的,但是我們可以通過Task來實現多任務。

簡單的說,可以採取以下方案:
定義一個主Task,將其置為常駐Task,用以進行Task調度和Task的啟動/終了和交互的管理。
定義一個Task優先順序列表,用優先順序來作為Task調度和管理的基礎。
定義一個共享域,和相應的事件分發/廣播/傳遞的管理機制,由主Task來實現各Task間的事件傳遞。
定義3個List,實現Active,Ready,Dead的Task的管理和調度。
定義各普通Task,包含Task基本信息:Task的棧指針,Task情報,Task存儲空間大小,Task的優先順序,Task的事件列表(定義可以接收/發送的事件,以及可以排隊的事件的個數),以及如果需要的話可以定義Task的從屬(父子)關系。

另外還有幾個注意點:
1. 通過C的臨界域(critical section)結合PV操作來實現某些Task的原子性處理要求。
2. 通過Signal來實現中斷和再開
3. 如果需要處理中斷和再開的話,一定要注意現場保護
4. 同優先順序的Task可以通過時間片輪循的方式進行多任務實現

暫時就想到這么多,有不明白的通過消息進一步交流吧:)

Ⅶ C語言多線程的操作步驟

線程創建
函數原型:intpthread_create(pthread_t*restrict tidp,const pthread_attr_t *restrict attr,void *(*start_rtn)(void),void *restrict arg);
返回值:若是成功建立線程返回0,否則返回錯誤的編號。
形式參數:pthread_t*restrict tidp要創建的線程的線程id指針;const pthread_attr_t *restrict attr創建線程時的線程屬性;void *(start_rtn)(void)返回值是void類型的指針函數;void *restrict arg start_rtn的形參。
線程掛起:該函數的作用使得當前線程掛起,等待另一個線程返回才繼續執行。也就是說當程序運行到這個地方時,程序會先停止,然後等線程id為thread的這個線程返回,然後程序才會斷續執行。
函數原型:intpthread_join(pthread_tthread, void **value_ptr);
參數說明如下:thread等待退出線程的線程號;value_ptr退出線程的返回值。
返回值:若成功,則返回0;若失敗,則返回錯誤號。
線程退出
函數原型:voidpthread_exit(void *rval_ptr);
獲取當前線程id
函數原型:pthread_tpthread_self(void);
互斥鎖
創建pthread_mutex_init;銷毀pthread_mutex_destroy;加鎖pthread_mutex_lock;解鎖pthread_mutex_unlock。
條件鎖
創建pthread_cond_init;銷毀pthread_cond_destroy;觸發pthread_cond_signal;廣播pthread_cond_broadcast;等待pthread_cond_wait。

Ⅷ 高手進,關於C語言在windows上建立多線程的問題(VC6.0上實現)

原因 是 在使用CreateThread 會造成一些 資源的無法釋放 比如c++對象

當然原因不止這些 還很有幾個 詳情 你可以參考windows核心編程

Ⅸ c語言中怎樣創建多線程

/*這是我寫的最簡單的多線程程序,看懂不?*/
#include <windows.h>
#include <stdio.h>
//#include <strsafe.h>

DWORD WINAPI ThreadProc1( LPVOID lpParam )
{

int i=0,j=0;
while(1)
{
printf("hello,this thread 1 ...\n");

//延時
for(i=0;i<200000000;i++)
{
;
}
}
}

DWORD WINAPI ThreadProc2( LPVOID lpParam )
{

int i=0,j=0;
while(1)
{
printf("hello,this thread 2 ...\n");

//延時
for(i=0;i<200000000;i++)
{
;
}
}
}

void main()
{
int i=0;
//創建線程1
CreateThread(
NULL, // default security attributes
0, // use default stack size
ThreadProc1, // thread function
NULL, // argument to thread function
0, // use default creation flags
NULL); // returns the thread identifier

//創建線程2
CreateThread(
NULL, // default security attributes
0, // use default stack size
ThreadProc2, // thread function
NULL, // argument to thread function
0, // use default creation flags
NULL); // returns the thread identifier

//讓主線程進入循環,主線程若退出,子線程1,2會被系統「殺死」
while(1)
{
printf("hello,this thread 0 ...\n");

//延時
for(i=0;i<200000000;i++)
{;}

}
}