第一范文网 - 专业文章范例文档资料分享平台

多线程程序设计 for Linux

来源:用户分享 时间:2025/5/29 3:21:05 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

{

sem_t*sem; intval; if(argc!=2) {

printf(“please inputa file name!\\n”); exit(1); }

if((sem_unlink(argv[1]))!=0) perror(“sem_unlink”); else

printf(“success”); exit(0); }

4.

sem_getvalue 名称:: 功能: 测试信号灯 头文件: #include 函数原形: intsem_getvalue(sem_t*sem,int*valp); 参数: sem指向信号灯的指针 返回值: 若成功则返回0,否则返回-1。

sem_getvalue在由valp指向的正数中返回所指定信号灯的当前值。如果该信 号灯当前已上锁,那么返回值或为0,或为某个负数,其绝对值就是等待该信 号灯解锁的线程数。

/*semgetvalue.c*/ #include #include #include #include #include

intmain(intargc,char**argv) {

sem_t*sem; intval;

if(argc!=2) {

printf(“please inputa file name!\\n”);

exit(1);

}

sem=sem_open(argv[1],0); sem_getvalue(sem,&val);

printf(“getvalue:value=%d\\n”,val); exit(0); }

5.

sem_wait/sem_trywait 名称:: 功能: 等待共享资源 头文件: #include 函数原形: intsem_wait(sem_t*sem); intsem_trywait(sem_t*sem); 参数: sem 指向信号灯的指针 返回值: 若成功则返回0,否则返回-1。 我们可以用sem_wait来申请共享资源,sem_wait函数可以测试所指定信号灯的值,如果该值大于0,那就将它减1并立即返回。我们就可以使用申请来的共享资源了。如果该值等于0,调用线程就被进入睡眠状态,直到该值变为大于 0,这时再将它减1,函数随后返回。sem_wait操作必须是原子的。sem_wait和sem_trywait的差别是:当所指定信号灯的值已经是0时,后者并不将调用线程投入睡眠。相反,它返回一个EAGAIN错误。

下面的程序我们先不去运行,稍后再运行。 /*semwait.c*/ #include #include #include #include #include

intmain(intargc,char**argv) {

sem_t*sem; intval;

if(argc!=2) {

printf(“please inputa file name!\\n”); exit(1); }

sem=sem_open(argv[1],0); sem_wait(sem);

sem_getvalue(sem,&val);

printf(“pid %ld has semaphore,value=%d\\n”,(long)getpid(),val); pause(); exit(0); }

6.

sem_post 名称:: 功能: 挂出共享资源 头文件: #include 函数原形: intsem_post(sem_t*sem); intsem_getvalue(sem_t*sem,int*valp); 参数: sem指向信号灯的指针 返回值: 若成功则返回0,否则返回-1。

当一个线程使用完某个信号灯时,它应该调用sem_post来告诉系统申请的 资源已经用完。本函数和sem_wait函数的功能正好相反,它把所指定的信号灯 的值加1,然后唤醒正在等待该信号灯值变为正数的任意线程。

下面的程序我们先不去运行,稍后再运行。 /*sempost.c*/ #include #include #include #include #include

intmain(intargc,char**argv) {

sem_t*sem; intval;

if(argc!=2) {

printf(“please inputa file name!\\n”); exit(1); }

sem=sem_open(argv[1],0); sem_post(sem);

sem_getvalue(sem,&val); printf(“value=%d\\n”,val); exit(0);

}

二、关于posix有名信号灯使用的几点注意 我们要注意以下几点:

1.Posix有名信号灯的值是随内核持续的。也就是说,一个进程创建了一个信号 灯,这个进程结束后,这个信号灯还存在,并且信号灯的值也不会改变。 下面我们利用上面的几个程序来证明这点 #./semopentest #./semgetvaluetest

value=1 信号的值仍然是1

2。当持有某个信号灯锁的进程没有释放它就终止时,内核并不给该信号灯解锁。 #./semopentest #./semwaittest&

pid 1834 has semaphore,value=0 #./semgetvaluetest

value=0 信号量的值变为0了

三、posix有名信号灯应用于多线程 #include #include #include #include #include

void *thread_function(void *arg);/*线程入口函数*/ void print(pid_t);/*共享资源函数*/ sem_t*sem;/*定义Posix有名信号灯*/ intval; /*定义信号灯当前值*/

intmain(intargc,char*argv[]) {

intn=0;

if(argc!=2) {

printf(“please inputa filename!\\n”); exit(1); }

sem=sem_open(argv[1],O_CREAT,0644,3);/*打开一个信号灯*/

搜索更多关于: 多线程程序设计 for Linux 的文档
多线程程序设计 for Linux.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c5ubv85lfr605ej21u7vo_6.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top