网站建设资讯

NEWS

网站建设资讯

c语言线程阻塞函数实现 线程阻塞的定义

C语言高手来解答,怎么实现进程阻塞的函数?谢谢啦。

看你提出的问题,应该自己有一部分代码了,我还是先提思路吧。 你需要一个阻塞队列,需要阻塞的进程放入阻塞队列,这个队列用单向链表即可。 然后再进程调度的间隙扫描阻塞队列,看有没有需要解除阻塞的进程,如果有将其从阻塞队列摘除,挂入就绪队列。

站在用户的角度思考问题,与客户深入沟通,找到崇义网站设计与崇义网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:网站设计、成都做网站、企业官网、英文网站、手机端网站、网站推广、域名注册、网络空间、企业邮箱。业务覆盖崇义地区。

求高手 详解阻塞函数与非阻塞函数的区别。再解释一下getch()和kbhit()的组合应用实例详解

阻塞

阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。有人也许会把阻塞调用和同步调用等同起来,实际上他是不同的。对于同

步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。例如,我们在CSocket中调用Receive函数,如果缓冲区中没有数

据,这个函数就会一直等待,直到有数据才返回。而此时,当前线程还会继续处理各种各样的消息。如果主窗口和调用函数在同一个线程中,除非你在特殊的界面操

作函数中调用,其实主界面还是应该可以刷新。socket接收数据的另外一个函数recv则是一个阻塞调用的例子。当socket工作在阻塞模式的时候,

如果没有数据的情况下调用该函数,则当前线程就会被挂起,直到有数据为止。

非阻塞

非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。

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()。否则会出现不输入字符这个函数

也会返回的情况。

3.在不同平台,输入回车,getch()将返回不同数值,而getchar()统一返回10(即\n)

1)windows平台下ENTER键会产生两个转义字符 \r\n,因此getch返回13(\r)。

2)unix、 linux系统中ENTER键只产生 \n ,因此getch返回10(\n)。

3)MAC OS中ENTER键将产生 \r ,因此getch返回13(\r)。

getch();并非标准C中的函数,不存在C语言中。所以在使用的时候要注意程序的可移植性。国内C语言新手常常使用getch();来暂停程序且不知道此函数来源,建议使用getchar();(如果情况允许)代替此功能或更换一款编译器。

kbhit()(VC++6.0下为_kbhit())

功 能及返回值: 检查当前是否有键盘输入,若有则返回一个非0值,否则返回0

用 法:int kbhit(void);

包含头文件: include conio.h

编辑本段程序示例

C语言

#includeconio.h

int main(void)

{

cprintf("Press any key to continue:");

while (!kbhit()) /* do nothing */ ;

cprintf("\r\nA key was pressed...\r\n");

return 0;

}

下面的代码,如果没有键盘输入程序一直输出Hello World,直到用户按Esc结束

#include conio.h

#include stdlib.h

int main( void )

{

char ch;

while( !kbhit() )

{

cprintf("Hello World\n");

if( kbhit() )

ch = getch();

if( 27 == ch )

break;

}

cprintf("End!\n");

system("pause");

return 0;

}

C++语言

#include conio.h

#include iostream

using namespace std;

int main()

{

while(!kbhit()) //当没有键按下

{

cout"无键按下"endl;

}

cout"有键按下"endl; //有键按下时输出这

system("pause");

}

kbhit() 在执行时,检测是否有按键按下,有按下返回非0值,一般是1

没有按下返回0;是非阻塞函数

getch() 在执行时,检测按下什么键,如果不按键该函数不返回;是阻塞函数

类似地

在Tc2.0中有一个处理键盘输入的函数bioskey();

int bioskey(int cmd);

当cmd为1时,bioskey()检测是否有键按下。没有键按下时返回0;有键按下时返回按键码(

任何按键码都不为0),但此时并不将检测到的按键码从键盘缓冲队列中清除。 是非阻塞参数。

当cmd为0时,bioskey()返回键盘缓冲队列中的按键码,并将此按键码从键盘缓冲队列中清

除。如果键盘缓冲队列为空,则一直等到有键按下,才将得到的按键码返回。是阻塞调用。

//个人理解kbhit()有点像bioskey(1)

C语言 阻塞、非阻塞和多线程有什么关系?

说到阻塞和非阻塞 的概念,就要了解同步和异步的概念吧

同步:多个线程可以同时访问同一个资源。比如对一个变量而言,线程们可以同时对他进行读写。

使用场景:多个线程同时访问一块数据,也叫共享区。对于多个线程同时访问一块数据的时候,必须使用同步,否则可能会出现不安全的情况。比如数据库中的脏读。但是,多个线程同时访问一块数据,有一种情况不需要同步技术,那就是原子操作,也就是说操作系统在底层保证了操作要么全部做完,要么不做。

异步:

使用场景:只有一个线程访问当前的数据。比如,观察者模式,没有共享区,主题发生变化,通知观察者更新,主题继续做自己的事情,不需要等待观察者更新完成后再工作。

同步分为阻塞IO和异步IO

异步可以分为阻塞IO和非阻塞的IO

异步阻塞IO 通过select和epoll实现


当前标题:c语言线程阻塞函数实现 线程阻塞的定义
文章路径:http://cdweb.net/article/dojoeji.html