當前位置:首頁 » 編程軟體 » c多線程編程教程

c多線程編程教程

發布時間: 2022-06-03 14:10:08

① 我想精通c語言編程,求高手指導學習方案。(比如C如何實現多線程,和多核程序設計等等)

想精通C就必須要了解底層知識,尤其是編譯原理,當你自己用C做出了一款C語言編譯器,基本可以說是精通C了(編譯器通常分兩部分,其中一部分是與CPU相關的驅動程序,這個可以直接用現成的,但語法分析以及語義分析之類的的要自己寫)。還有你問C如何實現多線程,我不太確定是什麼意思?你是想用C程序通過調用現有的線程庫來實現多線程編程還是想問如何用C現實出多線程的過程(也就是線程庫的製作)?前者隨便網上一搜就有一堆方法,後者基本只能在linux上做,看看Linux內核中有關多線程實現的源代碼就差不多了(建議先讀一讀Linux內核設計與實現第3版再看代碼)

② 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語言,windows多線程編程

點量Http、ftp多線程斷點續傳下載組件(下載DLL)的開發目的是讓用戶可以無需關心Http/FTP協議的具體細節,只需要幾十行甚至幾行代碼,便可以實現一個功能完善的Http/FTP下載軟體。點量Http/FTP下載組件(DLL)支持多線程、斷點續傳、顯示詳細下載過程、自動查找鏡像網址、支持代理傳輸等完善的功能。

點量Http、FTP下載內核源碼使用高效的c++代碼編寫,提供標準的動態鏈接庫(DLL),可供C/C++、Delphi、C#、Java、VB等語言和各常用開發環境調用,讓您完全像調用系統API一樣的調用。

點量Http/FTP組件的功能簡介:

標准Http和FTP下載支持:完全標準的Http和FTP協議支持,內部通過網址自動區分是Http還是FTP下載。
極速下載(2.0以後版本):超越國內絕大多數下載軟體的下載速度。新版內核在2M ADSL的環境下下載,有些文件的速度可以達到1400K位元組/秒以上,超過了帶寬的極限。下載速度可以用極速形容。
多線程傳輸:可以將文件自動分塊,並採用多線程下載。並可自由設置線程數目。
斷點續傳:點量Http/FTP有優秀的斷點續傳支持,每次啟動自動從上次下載的位置開始,不需要重復下載。
提供詳細的下載詳情介面(2.0以後版本):可以看到整個下載過程的步驟,比如開啟了多少線程、伺服器的應答過程、錯誤信息等。
支持多種高級設置:設置線程數目、磁碟緩存大小、搜索鏡像伺服器的詳細參數設置、下載文件完成後同步文件為伺服器上的文件時間、下載過程中可以自定義文件臨時後綴、未完成的文件設為隱藏屬性。
支持磁碟緩存:點量Http/FTP下載DLL支持設置磁碟緩存,減少對磁碟的讀寫,並提升下載速度。
支持設置Refer:點量Http/FTP下載組件支持設置下載時的Refer,以便可以繞過一些防盜鏈的網站,直接下載內容。
限速功能:點量Http/FTP下載組件可方便的設置下載限速。
多種磁碟分配方式:點量Http/FTP下載組件支持預分配和邊下載邊分配兩種磁碟方式,滿足多種下載需求。
自動搜索鏡像加速:點量Http/FTP內置了鏡像搜索功能,在下載文件的同時,會自動搜索哪些其它網站還有這個文件,自動從其它網址下載加速。
可提供源碼:支付一定的費用,便可以獲得全部的點量Http/FTP下載組件的源代碼,免除您的所有後顧之憂。
良好的服務:作為點量軟體旗下的軟體,可享受到點量軟體的優秀服務,我們的服務讓您如同擁有一個稱心的專業員工。

點量Http/FTP 下載組件可以適用於任何Http和FTP下載的領域,讓您可以在1天內完成一個完整的Http下載軟體的全部功能。比如,您可以用於產品的升級、文件的下載和傳輸等。
點量Http/FTP內核可以為您帶來:

1、大大節省您的開發成本:了解Http和FTP的協議,再去編碼、測試,即使對於一個非常有經驗的開發人員來說,也需要較長期的時間,此間耗費的人力資源成本和管理成本可謂不少。而使用點量Http/FTP,您就不需要從製造輪子開始製造您的汽車,將注意力集中於車的設計而不是基礎設備的建設。何況我們的產品性能是如此優越!

2、強有力的技術支持:作者長期從事下載技術的研發,所提供的技術支持相當於您僱傭了一位具有豐富經驗,無需從頭學習的開發人員,可以在您的系統建設過程中為您提供整體系統架設的意見。

如果您是個人作為非商業目的使用,您可以自由、免費的使用點量Http/FTP下載組件內核庫和演示程序,也期待收到您反饋的意見和建議;如果您是商業使用,那麼您需要聯系作者申請產品的商業授權。

④ c++ 多線程編程常用的幾個函數

1、C++多線程也可以使用UNIX C的庫函數,pthread_mutex_t,pthread_create,pthread_cond_t,pthread_detach,pthread_mutex_lock/unlock,等等。在使用多線程的時候,你需要先創建線程,使用pthread_create,你可以使主線程等待子線程使用pthread_join,也可以使線程分離,使用pthread_detach。線程使用中最大的問題就是同步問題,一般使用生產著消費者模型進行處理,使用條件變數pthread_cond_t,pthread_mutex,pthread_cond_wait來實現。
2、常式:
//創建5個線程
#include <pthread.h>
#include <stdlib.h>

void* work_thread(void* arg)
{

//線程執行體
return 0;
}
int main(int argc,char* argv[])
{
int nthread = 5;//創建線程的個數
pthread_t tid;//聲明一個線程ID的變數;
for(int i=0;i<nthread;i++)
{
pthread_create(&tid,NULL,work_thread,NULL);
}
sleep(60);//睡眠一分鍾,你可以看下線程的運行情況,不然主進程會很快節結束了。
}
pthread_create(&tid,NULL,work_thread,NULL);//創建線程的函數,第一個參數返回線程的ID;第二個參數是線程的屬性,一般都置為NULL;第三個參數是線程函數,線程在啟動以後,會自動執行這個函數;第四個參數是線程函數的參數,如果有需要傳遞給線程函數的參數,可以放在這個位置,可以是基礎類型,如果你有不止一個參數想傳進線程函數,可以做一個結構體,然後傳入。

⑤ 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語言在windows上建立多線程的問題(VC6.0上實現)

東西,往往實例才是最讓人感興趣的,老是學基礎理論,不動手,感覺沒有成就感,呵呵。

下面先來一個實例。我們通過創建兩個線程來實現對一個數的遞加。
或許這個實例沒有實際運用的價值,但是稍微改動一下,我們就可以用到其他地方去拉。

下面是我們的代碼:

/*thread_example.c : c multiple thread programming in linux
*author : falcon
*E-mail : [email protected]
*/
#include <pthread.h>
#include <stdio.h>
#include <sys/time.h>
#include <string.h>
#define MAX 10

pthread_t thread[2];
pthread_mutex_t mut;
int number="0", i;

void *thread1()
{
printf ("thread1 : I'm thread 1\n");

for (i = 0; i < MAX; i++)
{
printf("thread1 : number = %d\n",number);
pthread_mutex_lock(&mut);
number++;
pthread_mutex_unlock(&mut);
sleep(2);
}

printf("thread1 :主函數在等我完成任務嗎?\n");
pthread_exit(NULL);
}

void *thread2()
{
printf("thread2 : I'm thread 2\n");

for (i = 0; i < MAX; i++)
{
printf("thread2 : number = %d\n",number);
pthread_mutex_lock(&mut);
number++;
pthread_mutex_unlock(&mut);
sleep(3);
}

printf("thread2 :主函數在等我完成任務嗎?\n");
pthread_exit(NULL);
}

void thread_create(void)
{
int temp;
memset(&thread, 0, sizeof(thread)); //comment1
/*創建線程*/
if((temp = pthread_create(&thread[0], NULL, thread1, NULL)) != 0) //comment2
printf("線程1創建失敗!\n");
else
printf("線程1被創建\n");

if((temp = pthread_create(&thread[1], NULL, thread2, NULL)) != 0) //comment3
printf("線程2創建失敗");
else
printf("線程2被創建\n");
}

void thread_wait(void)
{
/*等待線程結束*/
if(thread[0] !=0) { //comment4
pthread_join(thread[0],NULL);
printf("線程1已經結束\n");
}
if(thread[1] !=0) { //comment5
pthread_join(thread[1],NULL);
printf("線程2已經結束\n");
}
}

int main()
{
/*用默認屬性初始化互斥鎖*/
pthread_mutex_init(&mut,NULL);

printf("我是主函數哦,我正在創建線程,呵呵\n");
thread_create();
printf("我是主函數哦,我正在等待線程完成任務阿,呵呵\n");
thread_wait();

return 0;
}

下面我們先來編譯、執行一下

引文:

falcon@falcon:~/program/c/code/ftp$ gcc -lpthread -o thread_example thread_example.c
falcon@falcon:~/program/c/code/ftp$ ./thread_example
我是主函數哦,我正在創建線程,呵呵
線程1被創建
線程2被創建
我是主函數哦,我正在等待線程完成任務阿,呵呵
thread1 : I'm thread 1
thread1 : number = 0
thread2 : I'm thread 2
thread2 : number = 1
thread1 : number = 2
thread2 : number = 3
thread1 : number = 4
thread2 : number = 5
thread1 : number = 6
thread1 : number = 7
thread2 : number = 8
thread1 : number = 9
thread2 : number = 10
thread1 :主函數在等我完成任務嗎?
線程1已經結束
thread2 :主函數在等我完成任務嗎?
線程2已經結束

實例代碼里頭的注釋應該比較清楚了吧,下面我把網路上介紹上面涉及到的幾個函數和變數給引用過來。

引文:

線程相關操作

一 pthread_t

pthread_t在頭文件/usr/include/bits/pthreadtypes.h中定義:
typedef unsigned long int pthread_t;
它是一個線程的標識符。

二 pthread_create

函數pthread_create用來創建一個線程,它的原型為:
extern int pthread_create __P ((pthread_t *__thread, __const pthread_attr_t *__attr,
void *(*__start_routine) (void *), void *__arg));
第一個參數為指向線程標識符的指針,第二個參數用來設置線程屬性,第三個參數是線程運行函數的起始地址,最後一個參數是運行函數的參數。這里,我們的函數thread不需要參數,所以最後一個參數設為空指針。第二個參數我們也設為空指針,這樣將生成默認屬性的線程。對線程屬性的設定和修改我們將在下一節闡述。當創建線程成功時,函數返回0,若不為0則說明創建線程失敗,常見的錯誤返回代碼為EAGAIN和EINVAL。前者表示系統限制創建新的線程,例如線程數目過多了;後者表示第二個參數代表的線程屬性值非法。創建線程成功後,新創建的線程則運行參數三和參數四確定的函數,原來的線程則繼續運行下一行代碼。

三 pthread_join pthread_exit

函數pthread_join用來等待一個線程的結束。函數原型為:
extern int pthread_join __P ((pthread_t __th, void **__thread_return));
第一個參數為被等待的線程標識符,第二個參數為一個用戶定義的指針,它可以用來存儲被等待線程的返回值。這個函數是一個線程阻塞的函數,調用它的函數將一直等待到被等待的線程結束為止,當函數返回時,被等待線程的資源被收回。一個線程的結束有兩種途徑,一種是象我們上面的例子一樣,函數結束了,調用它的線程也就結束了;另一種方式是通過函數pthread_exit來實現。它的函數原型為:
extern void pthread_exit __P ((void *__retval)) __attribute__ ((__noreturn__));
唯一的參數是函數的返回代碼,只要pthread_join中的第二個參數thread_return不是NULL,這個值將被傳遞給 thread_return。最後要說明的是,一個線程不能被多個線程等待,否則第一個接收到信號的線程成功返回,其餘調用pthread_join的線程則返回錯誤代碼ESRCH。
在這一節里,我們編寫了一個最簡單的線程,並掌握了最常用的三個函數pthread_create,pthread_join和pthread_exit。下面,我們來了解線程的一些常用屬性以及如何設置這些屬性。

互斥鎖相關

互斥鎖用來保證一段時間內只有一個線程在執行一段代碼。

一 pthread_mutex_init

函數pthread_mutex_init用來生成一個互斥鎖。NULL參數表明使用默認屬性。如果需要聲明特定屬性的互斥鎖,須調用函數 pthread_mutexattr_init。函數pthread_mutexattr_setpshared和函數 pthread_mutexattr_settype用來設置互斥鎖屬性。前一個函數設置屬性pshared,它有兩個取值, PTHREAD_PROCESS_PRIVATE和PTHREAD_PROCESS_SHARED。前者用來不同進程中的線程同步,後者用於同步本進程的不同線程。在上面的例子中,我們使用的是默認屬性PTHREAD_PROCESS_ PRIVATE。後者用來設置互斥鎖類型,可選的類型有PTHREAD_MUTEX_NORMAL、PTHREAD_MUTEX_ERRORCHECK、 PTHREAD_MUTEX_RECURSIVE和PTHREAD _MUTEX_DEFAULT。它們分別定義了不同的上所、解鎖機制,一般情況下,選用最後一個默認屬性。

二 pthread_mutex_lock pthread_mutex_unlock pthread_delay_np

pthread_mutex_lock聲明開始用互斥鎖上鎖,此後的代碼直至調用pthread_mutex_unlock為止,均被上鎖,即同一時間只能被一個線程調用執行。當一個線程執行到pthread_mutex_lock處時,如果該鎖此時被另一個線程使用,那此線程被阻塞,即程序將等待到另一個線程釋放此互斥鎖。

注意:

1 需要說明的是,上面的兩處sleep不光是為了演示的需要,也是為了讓線程睡眠一段時間,讓線程釋放互斥鎖,等待另一個線程使用此鎖。下面的參考資料1里頭說明了該問題。但是在linux下好像沒有pthread_delay_np那個函數(我試了一下,提示沒有定義該函數的引用),所以我用了sleep來代替,不過參考資料2中給出另一種方法,好像是通過pthread_cond_timedwait來代替,里頭給出了一種實現的辦法。

2 請千萬要注意里頭的注釋comment1-5,那是我花了幾個小時才找出的問題所在。
如果沒有comment1和comment4,comment5,將導致在pthread_join的時候出現段錯誤,另外,上面的comment2和comment3是根源所在,所以千萬要記得寫全代碼。因為上面的線程可能沒有創建成功,導致下面不可能等到那個線程結束,而在用pthread_join的時候出現段錯誤(訪問了未知的內存區)。另外,在使用memset的時候,需要包含string.h頭文件哦

⑦ c語言 多線程套接字編程

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/wait.h>
#include <sys/socket.h>

#define PORT 5000 // The port which is communicate with server
#define BACKLOG 10
#define LENGTH 512 // Buffer length
int main ()
{ int sockfd; // Socket file descriptor
int nsockfd; // New Socket file descriptor
int num;
int sin_size; // to store struct size
char sdbuf[LENGTH]; // Send buffer
struct sockaddr_in addr_local;
struct sockaddr_in addr_remote;
char sendstr[16]= {"123456789 abcde"};

/* Get the Socket file descriptor */
if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )
{
printf ("ERROR: Failed to obtain Socket Despcritor.\n");
return (0);
}
else
{
printf ("OK: Obtain Socket Despcritor sucessfully.\n");
}

/* Fill the local socket address struct */
addr_local.sin_family = AF_INET; // Protocol Family
addr_local.sin_port = htons(PORT); // Port number
addr_local.sin_addr.s_addr = INADDR_ANY; // AutoFill local address
bzero(&(addr_local.sin_zero), 8); // Flush the rest of struct

/* Blind a special Port */
if( bind(sockfd, (struct sockaddr*)&addr_local, sizeof(struct sockaddr)) == -1 )
{
printf ("ERROR: Failed to bind Port %d.\n",PORT);
return (0);
}
else
{
printf("OK: Bind the Port %d sucessfully.\n",PORT);
}

/* Listen remote connect/calling */
if(listen(sockfd,BACKLOG) == -1)
{
printf ("ERROR: Failed to listen Port %d.\n", PORT);
return (0);
}
else
{
printf ("OK: Listening the Port %d sucessfully.\n", PORT);
}

while(1)
{
sin_size = sizeof(struct sockaddr_in);

/* Wait a connection, and obtain a new socket file despriptor for single connection */
if ((nsockfd = accept(sockfd, (struct sockaddr *)&addr_remote, &sin_size)) == -1)
{
printf ("ERROR: Obtain new Socket Despcritor error.\n");
continue;
}
else
{
printf ("OK: Server has got connect from %s.\n", inet_ntoa(addr_remote.sin_addr));
}

/* Child process */
if(!fork())
{
printf("You can enter string, and press 'exit' to end the connect.\n");
while(strcmp(sdbuf,"exit") != 0)
{
scanf("%s", sdbuf);
if((num = send(nsockfd, sdbuf, strlen(sdbuf), 0)) == -1)
{
printf("ERROR: Failed to sent string.\n");
close(nsockfd);
exit(1);
}
printf("OK: Sent %d bytes sucessful, please enter again.\n", num);
}
}
close(nsockfd);
while(waitpid(-1, NULL, WNOHANG) > 0);
}
}

⑧ c語言如何編寫一個簡單的多線程程序

這是一個多線程例子,裡面只有兩個線程,是生產者/消費者模式,已編譯通過,注釋很詳細,
如下:

/* 以生產者和消費者模型問題來闡述Linux線程的控制和通信你
生產者線程將生產的產品送入緩沖區,消費者線程則從中取出產品。
緩沖區有N個,是一個環形的緩沖池。
*/
#include <stdio.h>
#include <pthread.h>

#define BUFFER_SIZE 16

struct prodcons
{
int buffer[BUFFER_SIZE];/*實際存放數據的數組*/
pthread_mutex_t lock;/*互斥體lock,用於對緩沖區的互斥操作*/
int readpos,writepos; /*讀寫指針*/
pthread_cond_t notempty;/*緩沖區非空的條件變數*/
pthread_cond_t notfull;/*緩沖區未滿 的條件變數*/
};

/*初始化緩沖區*/
void pthread_init( struct prodcons *p)
{
pthread_mutex_init(&p->lock,NULL);
pthread_cond_init(&p->notempty,NULL);
pthread_cond_init(&p->notfull,NULL);
p->readpos = 0;
p->writepos = 0;
}

/*將產品放入緩沖區,這里是存入一個整數*/
void put(struct prodcons *p,int data)
{
pthread_mutex_lock(&p->lock);
/*等待緩沖區未滿*/
if((p->writepos +1)%BUFFER_SIZE ==p->readpos)
{
pthread_cond_wait(&p->notfull,&p->lock);
}
p->buffer[p->writepos] =data;
p->writepos++;
if(p->writepos >= BUFFER_SIZE)
p->writepos = 0;
pthread_cond_signal(&p->notempty);
pthread_mutex_unlock(&p->lock);
}
/*從緩沖區取出整數*/
int get(struct prodcons *p)
{
int data;
pthread_mutex_lock(&p->lock);
/*等待緩沖區非空*/
if(p->writepos == p->readpos)
{
pthread_cond_wait(&p->notempty ,&p->lock);//非空就設置條件變數notempty
}
/*讀書據,移動讀指針*/
data = p->buffer[p->readpos];
p->readpos++;
if(p->readpos == BUFFER_SIZE)
p->readpos = 0;
/*設置緩沖區未滿的條件變數*/
pthread_cond_signal(&p->notfull);
pthread_mutex_unlock(&p->lock);
return data;
}
/*測試:生產站線程將1 到1000的整數送入緩沖區,消費者線程從緩沖區中獲取整數,兩者都列印信息*/
#define OVER (-1)
struct prodcons buffer;
void *procer(void *data)
{
int n;
for( n=0;n<1000;n++)
{
printf("%d ------>\n",n);
put(&buffer,n);
}
put(&buffer,OVER);
return NULL;
}
void *consumer(void *data)
{
int d;
while(1)
{
d = get(&buffer);
if(d == OVER)
break;
else
printf("----->%d\n",d);
}
return NULL;
}
int main()
{
pthread_t th_p,th_c;
void *retval;
pthread_init(&buffer);
pthread_create(&th_p,NULL,procer,0);
pthread_create(&th_c,NULL,consumer,0);
/*等待兩個線程結束*/
pthread_join(th_p, &retval);
pthread_join(th_c,&retval);
return 0;
}

⑨ c語言多線程編程問題

C語言中多線程的實現原理就是線程的原理,本人只了解Linux下面的C,linux下面的線程,不就是進程中的一個控制流么,相對來說代碼很簡單,但是原理卻是很復雜,很難說清,還需要自己詳細學習研究,下面是一個很簡單的例子,哪邊都能找到,自己運行下看看吧
#include <pthread.h>
#include <stdio.h>
#include <sys/time.h>
#include <string.h>
#define MAX 10
pthread_t thread[2];
pthread_mutex_t mut;
int number=0, i;
void *thread1()
{
printf ("thread1 : I'm thread 1\n");
for (i = 0; i < MAX; i++)
{
printf("thread1 : number = %d\n",number);
pthread_mutex_lock(&mut);
number++;
pthread_mutex_unlock(&mut);
sleep(2);
}
printf("thread1 :主函數在等我完成任務嗎?\n");
pthread_exit(NULL);
}
void *thread2()
{
printf("thread2 : I'm thread 2\n");
for (i = 0; i < MAX; i++)
{
printf("thread2 : number = %d\n",number);
pthread_mutex_lock(&mut);
number++;
pthread_mutex_unlock(&mut);
sleep(3);
}
printf("thread2 :主函數在等我完成任務嗎?\n");
pthread_exit(NULL);
}
void thread_create(void)
{
int temp;
memset(&thread, 0, sizeof(thread)); //comment1
/*創建線程*/
if((temp = pthread_create(&thread[0], NULL, thread1, NULL)) != 0) //comment2
printf("線程1創建失敗!\n");
else
printf("線程1被創建\n");
if((temp = pthread_create(&thread[1], NULL, thread2, NULL)) != 0) //comment3
printf("線程2創建失敗");
else
printf("線程2被創建\n");
}
void thread_wait(void)
{
/*等待線程結束*/
if(thread[0] !=0) { //comment4
pthread_join(thread[0],NULL);
printf("線程1已經結束\n");
}
if(thread[1] !=0) { //comment5
pthread_join(thread[1],NULL);
printf("線程2已經結束\n");
}
}
int main()
{
/*用默認屬性初始化互斥鎖*/
pthread_mutex_init(&mut,NULL);
printf("我是主函數哦,我正在創建線程,呵呵\n");
thread_create();
printf("我是主函數哦,我正在等待線程完成任務阿,呵呵\n");
thread_wait();
return 0;
}

熱點內容
java返回this 發布:2025-10-20 08:28:16 瀏覽:705
製作腳本網站 發布:2025-10-20 08:17:34 瀏覽:969
python中的init方法 發布:2025-10-20 08:17:33 瀏覽:677
圖案密碼什麼意思 發布:2025-10-20 08:16:56 瀏覽:830
怎麼清理微信視頻緩存 發布:2025-10-20 08:12:37 瀏覽:737
c語言編譯器怎麼看執行過程 發布:2025-10-20 08:00:32 瀏覽:1076
郵箱如何填寫發信伺服器 發布:2025-10-20 07:45:27 瀏覽:308
shell腳本入門案例 發布:2025-10-20 07:44:45 瀏覽:188
怎麼上傳照片瀏覽上傳 發布:2025-10-20 07:44:03 瀏覽:875
python股票數據獲取 發布:2025-10-20 07:39:44 瀏覽:829