可以參考壹下,應該差不多。
首先,如何創建壹個線程
使用的頭文件
pthread.h
信號量
stdio.h
字符串
定義線程標識
pthread_t
創建線程
pthread_create
對應於作為線程的函數的程序段。
註意力問題
確保進程不會結束(在創建線程後添加壹個死循環)
在線程中添加While(1)語句,這是壹個無限循環,保證進程不會結束。
二、控制線程並發的功能
Sem_t:信號的類型。
Sem_init:初始化信號
Sem_wait:相當於p操作。
Sem_post:相當於v操作。
第三,實現原型系統
父親、母親、兒子和女兒的話題:
桌子上有壹個盤子,壹次只能放壹個水果。爸爸放蘋果,媽媽放橘子,兒子在盤子裏等橘子,女兒在盤子裏等蘋果。分別通過P、V操作和管程實現。
每個線程壹個。
pthread_t父親;父進程
pthread_t母親;母進程
pthread _ t son子過程
pthread_t女兒;子進程
盤子可以用壹個變量來表示。
sem_t空;
每個線程並不是只做壹次,可以是無限次,也可以是有限次。
使用While(1)控制每個線程無限循環。
輸出該線程每次執行的信息。
printf("%s\n ",(char *)arg);通過參數arg輸出相應線程執行信息。
編譯方法
gcc hex.c -lpthread
生成默認的可執行文件a.out
進入。/a.out命令來運行。
查看結果:程序的連續運行表明
父親放進壹個蘋果。
女兒得到壹個蘋果。
媽媽放了壹個橘子。
兒子買個橘子。
媽媽放了壹個橘子。
兒子買個橘子。
……………… ..
四、程序源代碼
# include & ltstdio.h & gt
# include & ltstring.h & gt
# include & ltsemaphore.h & gt
# include & ltpthread.h & gt
sem_t空;//定義信號量
sem _ t applefull
sem _ t orangefull
void * procf(void * arg)//父線程
{
while(1){
SEM _ wait(amp;空);//P操作
printf("%s\n ",(char *)arg);
SEM _ post(& amp;apple full);//V操作
睡眠(7);
}
}
void * procm(void * arg)//母線程
{
while(1){
SEM _ wait(amp;空);
printf("%s\n ",(char *)arg);
SEM _ post(& amp;orange full);
睡眠(3);
}
}
void * procs(void * arg)//子線程
{
while(1){
SEM _ wait(amp;orange full);
printf("%s\n ",(char *)arg);
SEM _ post(& amp;空);
睡眠(2);
}
}
void * procd(void * arg)//守護線程
{
while(1){
SEM _ wait(amp;apple full);
printf("%s\n ",(char *)arg);
SEM _ post(& amp;空);
睡眠(5);
}
}
主()
{
pthread_t父親;//定義壹個線程
pthread_t母親;
pthread _ t son
pthread_t女兒;
SEM _ init(& amp;空,0,1);//信號量初始化
SEM _ init(& amp;applefull,0,0);
SEM _ init(& amp;orangefull,0,0);
pthread _ create(amp;父親,NULL,procf,“父親輸入壹個蘋果。”);//創建壹個線程
pthread _ create(amp;媽媽,NULL,procm,“媽媽輸入壹個橘子。”);
pthread _ create(amp;女兒,NULL,procd,“女兒得到壹個蘋果。”);
pthread _ create(amp;兒子,NULL,procs,“兒子拿個橘子。”);
While(1){} //循環等待
}