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

linux多线程编程(6)

来源:网络收集 时间:2019-02-16 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

#include #include #include #include void print(pid_t); sem_t *sem; /*定义Posix有名信号灯*/ int val; /*定义信号灯当前值*/ int main(int argc,char *argv[]) { int n=0; if(argc!=2) { printf(“please input a file name!\\n”); exit(1); } sem=sem_open(argv[1],O_CREAT,0644,2); /*打开一个信号灯, 初值设为2*/ while(n++<5) /*循环创建5个子进程,使它们同步运行*/ { if(fork()==0) { sem_wait(sem); /*申请信号灯*/ print(getpid()); /*调用共享代码段*/ sleep(1); sem_post(sem); /*释放信号灯*/ printf(“I’m finished,my pid is %d\\n”,getpid()); return 0; } } wait(); /*等待所有子进程结束*/ sem_close(sem); sem_unlink(argv[1]); exit(0); } void print(pid_t pid) { printf(“I get it,my pid is %d\\n”,pid); sem_getvalue(sem,&val); printf(“Now the value have %d\\n”,val); } 程序编译后运行会得到如下结果: #./8_2 8_2.c

I get it,my tid is 1082330304 Now the value have 1

I get it,my tid is 1090718784 Now the value have 0

I finished,my pid is 1082330304 I finished,my pid is 1090718784

I get it,my tid is 1099107264 Now the value have 1

I get it,my tid is 1116841120 Now the value have 0

I finished,my pid is 1099107264 I finished,my pid is 1116841120 I get it,my tid is 1125329600 Now the value have 1

I finished,my pid is 1125329600

五、基于内存的信号灯

前面已经介绍了Posix有名信号灯。这些信号灯由一个name参数标识,它通常指代文件系统中的某个文件。然而Posix也提供基于内存的信号灯,它们由应用程序分配信号灯的内存空间,然后由系统初始化它们的值。 7. 名称:: 功能: 头文件: sem_init/sem_destroy 初始化/关闭信号等 #include 函数原形: int sem_init(sem_t *sem,int shared,unsigned int value); int sem_getvalue(sem_t *sem); sem 指向信号灯的指针 shared 作用范围 value 信号灯初始值 返回值: 若成功则返回0,否则返回-1。 参数: 基于内存的信号灯是由sem_init初始化的。sem参数指向必须由应用程序分配的sem_t变量。如果shared为0,那么待初始化的信号灯是在同一进程的各个线程共享的,否则该信号灯是在进程间共享的。当shared为零时,该信号灯必须存放在即将使用它的所有进程都能访问的某种类型的共享内存中。跟sem_open一样,value参数是该信号灯的初始值。

使用完一个基于内存的信号灯后,我们调用sem_destroy关闭它。

除了sem_open和sem_close外,其它的poisx有名信号灯函数都可以用于基于内存的信号灯。

注意:posix基于内存的信号灯和posix有名信号灯有一些区别,我们必须注意到这些。 1.sem_open不需要类型与shared的参数,有名信号灯总是可以在不同进程间共享的。 2.sem_init不使用任何类似于O_CREAT标志的东西,也就是说,sem_init总是初始化信号灯的值。因此,对于一个给定的信号灯,我们必须小心保证只调用一次sem_init。

3.sem_open返回一个指向某个sem_t变量的指针,该变量由函数本身分配并初始化。但sem_init的第一个参数是一个指向某个sem_t变量的指针,该变量由调用者分配,然后由sem_init函数初始化。

4.posix有名信号灯是通过内核持续的,一个进程创建一个信号灯,另外的进程可以通过该信号灯的外部名(创建信号灯使用的文件名)来访问它。posix基于内存的信号灯的持续性却是不定的,如果基于内存的信号灯是由单个进程内的各个线程共享的,那么该信号灯就是随进程持续的,当该进程终止时它也会消失。如果某个基于内存的信号灯是在不同进程间同步的,该信号灯必须存放在共享内存区中,这要只要该共享内存区存在,该信号灯就存在。

5.基于内存的信号灯应用于进程很麻烦(待会你会知道为什么),而有名信号灯却很方便,基于内存的信号灯比较适合应用于一个进程的多个线程。

下面是posix基于内存的信号灯实现一个进程的各个线程间的互次。 #include #include #include #include #include #incude void *thread_function(void *arg); /*线程入口函数*/ void print(void); /*共享资源函数*/ sem_t bin_sem; /*定义信号灯*/ int value; /*定义信号量的灯*/ int main() { int n=0; pthread_t a_thread; if((sem_init(&bin_sem,0,2))!=0) /*初始化信号灯,初始值为2*/ { perror(“sem_init”); exit(1); } while(n++<5) /*循环创建5个线程*/ { if((pthread_create(&a_thread,NULL,thread_function,NULL))!=0) { perror(“Thread creation failed”); exit(1); } } pthread_join(a_thread,NULL);/*等待子线程返回*/ } void *thread_function(void *arg) { sem_wait(&bin_sem); /*等待信号灯*/

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库linux多线程编程(6)在线全文阅读。

linux多线程编程(6).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/476124.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: