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

多线程程序设计 for Linux

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

7. 名称:: sem_init/sem_destroy

功能: 初始化/关闭信号等 #include 头文件: 函数原形: intsem_init(sem_t*sem,intshared,unsignedintvalue); intsem_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);/*线程入口函数*/

voidprint(void);/*共享资源函数*/

sem_tbin_sem;/*定义信号灯*/

intvalue;/*定义信号量的灯*/

intmain() {

intn=0;

pthread_ta_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(“Threadcreationfailed”); exit(1); }

}

pthread_join(a_thread,NULL);/*等待子线程返回*/ }

void*thread_function(void*arg) {

sem_wait(&bin_sem);/*等待信号灯*/

print(); sleep(1);

sem_post(&bin_sem);/*挂出信号灯*/

printf(“Ifinished,mypidis%d\\n”,pthread_self()); pthread_exit(arg); }

voidprint() {

printf(“Iget it,mytidis%d\\n”,pthread_self());

sem_getvalue(&bin_sem,&value);/*获取信号灯的值*/

printf(“Nowthevaluehave%d\\n”,value); }

posix基于内存的信号灯和有名信号灯基本是一样的,上面的几点区别就可以了。

下面是运行结果:

#gcc–lpthread–oseminitthreadseminitthread.c

#./seminitthread

Igetit,mytidis1082330304

Now thevaluehave1 Igetit,mytidis1090718784

Now thevaluehave0

Ifinished,mypidis1082330304

Ifinished,mypidis1090718784 Igetit,mytidis1099107264

Now thevaluehave1 Igetit,mytidis1116841120 Now thevaluehave0

Ifinished,mypidis1099107264 Ifinished,mypidis1116841120 Igetit,mytidis1125329600 Now thevaluehave1

Ifinished,mypidis1125329600 下面是经典的生产者消费者问题: #include

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