當前位置:首頁 » 編程語言 » c語言阻塞

c語言阻塞

發布時間: 2022-12-19 05:59:45

⑴ 怎麼用c語言編程 實現創建原語、撤銷原語、阻塞原語和喚醒原語

下,應該差不多

一、如何建立線程
用到的頭文件
(a)pthread.h
(b)semaphore.h
(c) stdio.h
(d)string.h
定義線程標識
pthread_t
創建線程
pthread_create
對應了一個函數作為線程的程序段
注意的問題
要保證進程不結束(在創建線程後加死循環)
在線程中加入While(1)語句,也就是死循環,保證進程不結束。

二、控制線程並發的函數
sem_t:信號量的類型
sem_init:初始化信號量
sem_wait:相當於P操作
sem_post:相當於V操作

三、實現原形系統
父親、母親、兒子和女兒的題目:
桌上有一隻盤子,每次只能放入一隻水果。爸爸專放蘋果,媽媽專放橘子,一個兒子專等吃盤子中的橘子,一個女兒專等吃盤子中的蘋果。分別用P,V操作和管程實現

每個對應一個線程
pthread_t father; father進程
pthread_t mother; mother進程
pthread_t son; son進程
pthread_t daughter; daughter進程

盤子可以用一個變數表示
sem_t empty;

各線程不是只做一次,可以是無限或有限次循環
用While(1)控制各線程無限次循環

輸出每次是那個線程執行的信息
printf("%s\n",(char *)arg);通過參數arg輸出對應線程執行信息

編譯方法
gcc hex.c -lpthread
生成默認的可執行文件a.out
輸入./a.out命令運行
查看結果:程序連續運行顯示出
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>
#include<string.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."); //創建線程
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){} //循環等待
}
另外,站長團上有產品團購,便宜有保證

⑵ C語言 UDP中revcfrom怎麼從阻塞中跳出

在創建套介面後調用一下ioctlsocket()函數,設置為非阻塞即可,如下:
//UDPServer.cpp
#pragma comment(lib,"ws2_32.lib")
#include<winsock2.h>
#include<stdio.h>
#include<string.h>
int main()
{
WSADATA wsaData;
int err = WSAStartup(WINSOCK_VERSION,&wsaData);
if(err!=0)
{
printf("Socket start failed:%d\n",err);
return -1;
}
//創建套介面:socket()
SOCKET sock;
sock = socket(AF_INET,SOCK_DGRAM,0);

//!!在此設置非阻塞!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
unsigned long iMode = 1;//為0時阻塞,非0時不阻塞
::ioctlsocket(sock,FIONBIO,&iMode);
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

if(sock==INVALID_SOCKET)
{
printf("Creat socket Failed:%d\n",WSAGetLastError());
WSACleanup();
return -1;
}
//綁定埠:bind()
sockaddr_in localaddr;
localaddr.sin_family = AF_INET;
localaddr.sin_port = htons(8800);
localaddr.sin_addr.s_addr = htonl(INADDR_ANY); //#define s_addr S_un.S_addr
err = bind(sock,(sockaddr *)&localaddr,sizeof(localaddr));//調用bind()綁定埠
if(err == SOCKET_ERROR) //出錯處理
{
printf("Bind failed:%d\n",WSAGetLastError());
closesocket(sock);
WSACleanup();
return -1;
}
//等待接收信息
char rbuf[1024];
sockaddr_in faraddr;
int farlen = sizeof(faraddr);
printf("Server is startup! Waiting for message:\n");
//do
while(true)
{
memset(rbuf,0,1024); //清空接收緩沖區rbuf[1024]
int rByte = recvfrom(sock,rbuf,1024,0,(sockaddr *)&faraddr,&farlen);//阻塞等待
if(rByte == SOCKET_ERROR)
{
printf("Recvfrom failed:%d\n",WSAGetLastError());
closesocket(sock);
WSACleanup();
return -1;
}

printf("UDP Recv %d Data from %s:%s\n",rByte,inet_ntoa(faraddr.sin_addr),rbuf);

if(strlen(rbuf)==0)
{
printf("Client %s have finished!\n",inet_ntoa(faraddr.sin_addr));
}

}//while(strlen(rbuf)!=0);//收到空數據包,則認為對方已經發送完成
return 0;
}

⑶ c語言socket編程中accept的阻塞問題

埠就是負責監聽連接請求的.如果監聽到該埠的請求那麼就可以確定是對你這個伺服器的請求.一旦這個埠被佔用,那麼其它任何程序都無法再使用這個埠.所以我們要避開系統常用埠,要從1024以上的埠選擇.
在伺服器端
sin_port
是不可以被設置為0的,
否則客戶端的確無法連接.
而客戶端可以設置為0,客戶端可以任意埠的,沒有影響.

⑷ C語言 getch() 為什麼會阻塞,,

getch();並非標准C中的函數,不存在C語言中。!!
所在頭文件:conio.h
建議換成getchar()之類的
getch()
getch():
所在頭文件:conio.h
函數用途:從控制台讀取一個字元,但不顯示在屏幕上
函數原型:int
getch(void)
返回值:讀取的字元
例如:
char
ch;或int
ch;
getch();或ch=getch();
用getch();會等待你按下任意鍵,再繼續執行下面的語句;
用ch=getch();會等待你按下任意鍵之後,把該鍵字元所對應的ASCII碼賦給ch,再執行下面的語句。
易錯點:1.所在頭文件是conio.h。而不是stdio.h。
2.在使用之前要調用initscr(),結束時要調用endwin()。否則會出現不輸入字元這個函數
也會返回的情況。
getch();並非標准C中的函數,不存在C語言中。所以在使用的時候要注意程序的可移植性。國內C語言新手常常使用getch();來暫停程序且不知道此函數來源,建議使用getchar();(如果情況允許)代替此功能或更換一款編譯器。

⑸ C語言高手來解答,怎麼實現進程阻塞的函數謝謝啦。

看你提出的問題,應該自己有一部分代碼了,我還是先提思路吧。 你需要一個阻塞隊列,需要阻塞的進程放入阻塞隊列,這個隊列用單向鏈表即可。 然後再進程調度的間隙掃描阻塞隊列,看有沒有需要解除阻塞的進程,如果有將其從阻塞隊列摘除,掛入就緒隊列。

⑹ 用C語言編寫socket程序時,聽說send函數有個阻塞模式,不知怎樣才能把它設置為阻塞模式

默認情況下就是阻塞模式了

⑺ 阻塞隊列,C語言高手來解答,怎麼實現進程阻塞的函數

當然可以,定義成全局變數或者在定義的那個函數返回此隊列把此返回的隊列作為實參傳遞給另一個函數

⑻ c語言如何釋放一個被阻塞住的線程

  1. 可以用線程同步機制進行,比如使用CEvent等

  2. 可以保留創建的線程指針,使用:

    BOOL TerminateThread( HANDLEhThread,DWORDdwExitCode);

linux系統c語言進程不想被sleep阻塞等待怎麼解決

1、啟動後檯子任務,在執行命令後加&操作符,表示將命令放在子shell中非同步執行。可以達到多線程效果。如下,sleep10#等待10秒,再繼續下一操作sleep10&#當前shell不等待,後檯子shell等待。
2、wait命令wait是用來阻塞當前進程的執行,直至指定的子進程執行結束後,才繼續執行。使用wait可以在bash腳本「多進程」執行模式下,起到一些特殊控制的作用。

⑽ 請問Linux下使用C語言編程如何實現進程的阻塞

你的想法對於單一進程是行不通的,因為一旦進程「阻塞」了,變數的值又怎麼可能自己改變呢?
如果你談的是多進程(或線程),那有很多方法可以使用。但恐怕你不是在進行多進程編程,因為這是多進程編程的最基本概念。如果連這些都未掌握,你根本沒辦法進行下去,更不用設計什麼變數i變數j的了。

熱點內容
網易雲上傳歌詞手機 發布:2025-01-28 03:42:51 瀏覽:61
m3u8緩存文件 發布:2025-01-28 03:42:51 瀏覽:547
編程算損耗 發布:2025-01-28 03:33:03 瀏覽:456
sql存儲過程返回多個結果 發布:2025-01-28 03:24:03 瀏覽:463
長安歐尚科賽哪個配置值得購買 發布:2025-01-28 03:19:35 瀏覽:116
c全排列演算法 發布:2025-01-28 03:18:16 瀏覽:754
梵蒂岡頂級時裝ftp 發布:2025-01-28 03:03:36 瀏覽:695
手游腳本有前途嗎 發布:2025-01-28 02:46:55 瀏覽:379
抓包編程 發布:2025-01-28 02:42:41 瀏覽:930
安卓平板上怎麼設置熱點 發布:2025-01-28 02:36:33 瀏覽:718