看你提出的問題,應(yīng)該自己有一部分代碼了,我還是先提思路吧。 你需要一個阻塞隊(duì)列,需要阻塞的進(jìn)程放入阻塞隊(duì)列,這個隊(duì)列用單向鏈表即可。 然后再進(jìn)程調(diào)度的間隙掃描阻塞隊(duì)列,看有沒有需要解除阻塞的進(jìn)程,如果有將其從阻塞隊(duì)列摘除,掛入就緒隊(duì)列。
十載的平陸網(wǎng)站建設(shè)經(jīng)驗(yàn),針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。成都營銷網(wǎng)站建設(shè)的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整平陸建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)公司從事“平陸網(wǎng)站設(shè)計”,“平陸網(wǎng)站推廣”以來,每個客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
當(dāng)使用阻塞函數(shù)時,讓一個函數(shù)不受其影響每200毫秒就運(yùn)行一次,最好還是用多線程!多線程實(shí)例可在我網(wǎng)盤下載:
#includestdio.h
int main()
{
char str[50];
int a;
scanf("%s%d",str,a,a);
printf("str=%s\n",str);
printf("a=%d\n",a);
return 0;
}
你下面的代碼我給你改了一下,把%s%d之間的空格去掉了,然后加了一個a,通過兩次賦值,消除緩沖中回車的干擾
端口就是負(fù)責(zé)監(jiān)聽連接請求的.如果監(jiān)聽到該端口的請求那么就可以確定是對你這個服務(wù)器的請求.一旦這個端口被占用,那么其它任何程序都無法再使用這個端口.所以我們要避開系統(tǒng)常用端口,要從1024以上的端口選擇.
在服務(wù)器端
sin_port
是不可以被設(shè)置為0的,
否則客戶端的確無法連接.
而客戶端可以設(shè)置為0,客戶端可以任意端口的,沒有影響.
下,應(yīng)該差不多
一、如何建立線程
用到的頭文件
(a)pthread.h
(b)semaphore.h
(c) stdio.h
(d)string.h
定義線程標(biāo)識
pthread_t
創(chuàng)建線程
pthread_create
對應(yīng)了一個函數(shù)作為線程的程序段
注意的問題
要保證進(jìn)程不結(jié)束(在創(chuàng)建線程后加死循環(huán))
在線程中加入While(1)語句,也就是死循環(huán),保證進(jìn)程不結(jié)束。
二、控制線程并發(fā)的函數(shù)
sem_t:信號量的類型
sem_init:初始化信號量
sem_wait:相當(dāng)于P操作
sem_post:相當(dāng)于V操作
三、實(shí)現(xiàn)原形系統(tǒng)
父親、母親、兒子和女兒的題目:
桌上有一只盤子,每次只能放入一只水果。爸爸專放蘋果,媽媽專放橘子,一個兒子專等吃盤子中的橘子,一個女兒專等吃盤子中的蘋果。分別用P,V操作和管程實(shí)現(xiàn)
每個對應(yīng)一個線程
pthread_t father; father進(jìn)程
pthread_t mother; mother進(jìn)程
pthread_t son; son進(jìn)程
pthread_t daughter; daughter進(jìn)程
盤子可以用一個變量表示
sem_t empty;
各線程不是只做一次,可以是無限或有限次循環(huán)
用While(1)控制各線程無限次循環(huán)
輸出每次是那個線程執(zhí)行的信息
printf("%s\n",(char *)arg);通過參數(shù)arg輸出對應(yīng)線程執(zhí)行信息
編譯方法
gcc hex.c -lpthread
生成默認(rèn)的可執(zhí)行文件a.out
輸入./a.out命令運(yùn)行
查看結(jié)果:程序連續(xù)運(yùn)行顯示出
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)等待
}
另外,站長團(tuán)上有產(chǎn)品團(tuán)購,便宜有保證
getch();并非標(biāo)準(zhǔn)C中的函數(shù),不存在C語言中。??!
所在頭文件:conio.h
建議換成getchar()之類的
getch()
getch():
所在頭文件:conio.h
函數(shù)用途:從控制臺讀取一個字符,但不顯示在屏幕上
函數(shù)原型:int
getch(void)
返回值:讀取的字符
例如:
char
ch;或int
ch;
getch();或ch=getch();
用getch();會等待你按下任意鍵,再繼續(xù)執(zhí)行下面的語句;
用ch=getch();會等待你按下任意鍵之后,把該鍵字符所對應(yīng)的ASCII碼賦給ch,再執(zhí)行下面的語句。
易錯點(diǎn):1.所在頭文件是conio.h。而不是stdio.h。
2.在使用之前要調(diào)用initscr(),結(jié)束時要調(diào)用endwin()。否則會出現(xiàn)不輸入字符這個函數(shù)
也會返回的情況。
getch();并非標(biāo)準(zhǔn)C中的函數(shù),不存在C語言中。所以在使用的時候要注意程序的可移植性。國內(nèi)C語言新手常常使用getch();來暫停程序且不知道此函數(shù)來源,建議使用getchar();(如果情況允許)代替此功能或更換一款編譯器。