c语言阻塞
⑴ 怎么用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语言如何释放一个被阻塞住的线程
可以用线程同步机制进行,比如使用CEvent等
可以保留创建的线程指针,使用:
BOOL TerminateThread( HANDLEhThread,DWORDdwExitCode);
⑼ linux系统c语言进程不想被sleep阻塞等待怎么解决
1、启动后台子任务,在执行命令后加&操作符,表示将命令放在子shell中异步执行。可以达到多线程效果。如下,sleep10#等待10秒,再继续下一操作sleep10当前shell不等待,后台子shell等待。
2、wait命令wait是用来阻塞当前进程的执行,直至指定的子进程执行结束后,才继续执行。使用wait可以在bash脚本“多进程”执行模式下,起到一些特殊控制的作用。
⑽ 请问Linux下使用C语言编程如何实现进程的阻塞
你的想法对于单一进程是行不通的,因为一旦进程“阻塞”了,变量的值又怎么可能自己改变呢?
如果你谈的是多进程(或线程),那有很多方法可以使用。但恐怕你不是在进行多进程编程,因为这是多进程编程的最基本概念。如果连这些都未掌握,你根本没办法进行下去,更不用设计什么变量i变量j的了。