下,應該差不多
十年專業(yè)網絡公司歷程,堅持以創(chuàng)新為先導的網站服務,服務超過上千多家企業(yè)及個人,涉及網站設計、APP應用開發(fā)、微信開發(fā)、平面設計、互聯(lián)網整合營銷等多個領域。在不同行業(yè)和領域給人們的工作和生活帶來美好變化。
一、如何建立線程
用到的頭文件
(a)pthread.h
(b)semaphore.h
(c) stdio.h
(d)string.h
定義線程標識
pthread_t
創(chuàng)建線程
pthread_create
對應了一個函數(shù)作為線程的程序段
注意的問題
要保證進程不結束(在創(chuàng)建線程后加死循環(huán))
在線程中加入While(1)語句,也就是死循環(huán),保證進程不結束。
二、控制線程并發(fā)的函數(shù)
sem_t:信號量的類型
sem_init:初始化信號量
sem_wait:相當于P操作
sem_post:相當于V操作
三、實現(xiàn)原形系統(tǒng)
父親、母親、兒子和女兒的題目:
桌上有一只盤子,每次只能放入一只水果。爸爸專放蘋果,媽媽專放橘子,一個兒子專等吃盤子中的橘子,一個女兒專等吃盤子中的蘋果。分別用P,V操作和管程實現(xiàn)
每個對應一個線程
pthread_t father; father進程
pthread_t mother; mother進程
pthread_t son; son進程
pthread_t daughter; daughter進程
盤子可以用一個變量表示
sem_t empty;
各線程不是只做一次,可以是無限或有限次循環(huán)
用While(1)控制各線程無限次循環(huán)
輸出每次是那個線程執(zhí)行的信息
printf("%s\n",(char *)arg);通過參數(shù)arg輸出對應線程執(zhí)行信息
編譯方法
gcc hex.c -lpthread
生成默認的可執(zhí)行文件a.out
輸入./a.out命令運行
查看結果:程序連續(xù)運行顯示出
father input an apple.
daughter get an apple.
mother input an orange.
son get an orange.
mother input an orange.
son get an orange.
………………..
四、程序源代碼
#include stdio.h
#includestring.h
#include semaphore.h
#include pthread.h
sem_t empty; //定義信號量
sem_t applefull;
sem_t orangefull;
void *procf(void *arg) //father線程
{
while(1){
sem_wait(empty); //P操作
printf("%s\n",(char *)arg);
sem_post(applefull); //V操作
sleep(7);
}
}
void *procm(void *arg) //mother線程
{
while(1){
sem_wait(empty);
printf("%s\n",(char *)arg);
sem_post(orangefull);
sleep(3);
}
}
void *procs(void *arg) //son線程
{
while(1){
sem_wait(orangefull);
printf("%s\n",(char *)arg);
sem_post(empty);
sleep(2);
}
}
void *procd(void *arg) //daughter線程
{
while(1){
sem_wait(applefull);
printf("%s\n",(char *)arg);
sem_post(empty);
sleep(5);
}
}
main()
{
pthread_t father; //定義線程
pthread_t mother;
pthread_t son;
pthread_t daughter;
sem_init(empty, 0, 1); //信號量初始化
sem_init(applefull, 0, 0);
sem_init(orangefull, 0, 0);
pthread_create(father,NULL,procf,"father input an apple."); //創(chuàng)建線程
pthread_create(mother,NULL,procm,"mother input an orange.");
pthread_create(daughter,NULL,procd,"daughter get an apple.");
pthread_create(son,NULL,procs,"son get an orange.");
while(1){} //循環(huán)等待
}
另外,站長團上有產品團購,便宜有保證
你的想法對于單一進程是行不通的,因為一旦進程“阻塞”了,變量的值又怎么可能自己改變呢?
如果你談的是多進程(或線程),那有很多方法可以使用。但恐怕你不是在進行多進程編程,因為這是多進程編程的最基本概念。如果連這些都未掌握,你根本沒辦法進行下去,更不用設計什么變量i變量j的了。
當然可以,定義成全局變量或者在定義的那個函數(shù)返回此隊列把此返回的隊列作為實參傳遞給另一個函數(shù)
看你提出的問題,應該自己有一部分代碼了,我還是先提思路吧。 你需要一個阻塞隊列,需要阻塞的進程放入阻塞隊列,這個隊列用單向鏈表即可。 然后再進程調度的間隙掃描阻塞隊列,看有沒有需要解除阻塞的進程,如果有將其從阻塞隊列摘除,掛入就緒隊列。