V的信号灯来同步对于linux共享内存存區域的访问(信号灯如何控制对临界代码的访问另起一篇说话)
二. 关于posix有洺信号灯使用的几点注意
1.Posix有名信号灯的值是随内核持续的也就是说,一个进程创建了一个信号灯这个进程结束后,这个信号灯还存在并且信号灯的值也不会改动。
下面我们利用上面的几个程式来证实这点
2当持有某个信号灯锁的进程没有释放他就终止时,内核并不给該信号灯解锁
3.posix有名信号灯应用于多线程
程式用循环的方法建立5个线程,然后让他们调用同一个线程处理函数thread_function在函数里我们利用信号量來限制访问共享资源的线程数。共享资源我们用print函数来代表在真正编程中他有能是个终端设备(如打印机)或是一段有实际意义的代码。
while(n++循环创建5个子进程使它们同步运行*/
程序编译后运行会得到如下结果:
前面已经介绍了Posix有名信号灯。这些信号灯由一个name参数标识它通瑺指代文件系统中的某个文件。然而Posix也提供基于内存的信号灯它们由应用程序分配信号灯的内存空间,然后由系统初始化它们的值
基於内存的信号灯是由sem_init初始化的。sem参数指向必须由应用程序分配的sem_t变量如果shared为0,那么待初始化的信号灯是在同一进程的各个线程共享的否则该信号灯是在进程间共享的。当shared为零时该信号灯必须存放在即将使用它的所有进程都能访问的某种类型的linux共享内存存中。跟sem_open一样value參数是该信号灯的初始值。
注意:posix基于内存的信号灯和posix有名信号灯有一些区别我们必须注意到这些。
下面是posix基于内存的信号灯实现一个进程的各个线程间的互次。
posix基于内存的信号灯和有名信号灯基本是一样的上面的几點区别就可以了。
下面的程序并不能得到我们想要的结果
while(n++循环创建5个子进程,使它们同步运行*/
问题在于sem信号灯不在linux共享内存存区中fork出來的子进程通常不共享父进程的内存空间。子进程是在父进程内存空间的拷贝上启动的它跟linux共享内存存不是一回事。
}版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。