快速业务通道

Linux下关于互斥锁及同步的移植(一)

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-28
讲完了前面关于多线程的基础知识后,说一下我最近关于移植的一些体会. 将win32程序关于多线程的内容移植到Linux下面,不能简单的按照函数对应来移植.不过通过下面的对应关系,再加上你对这些模式的深入了解,相信会移植的很成功. 信号量 Windows 信号量是一些计数器变量,允许有限个线程/进程访问共享资源.Linux POSIX 信号量也是一些计数器变量,可以用来在 Linux 上实现 Windows 上的信号量功能.
  • 信号量的类型: Windows 提供了有名(named)信号量和无名(unnamed)信号量.有名信号量可以在进程之间进行同步.在 Linux 上,在相同进程的不同线程之间,则只使用 POSIX 信号量.在进程之间,可以使用 System V 信号量.
  • 等待函数中的超时: 当在一个等待函数中使用时,可以为 Windows 信号量对象指定超时值.在 Linux 中,并没有提供这种功能,只能通过应用程序逻辑处理超时的问题.
创建信号量 在 Windows 中,可以使用 CreateSemaphore() 创建或打开一个有名或无名的信号量.
HANDLE CreateSemaphore(

  LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,

  LONG lInitialCount,

  LONG lMaximumCount,

  LPCTSTR lpName

);

在这段代码中:
  • lpSemaphoreAttributes 是一个指向安全性属性的指针.如果这个指针为空,那么这个信号量就不能被继承.
  • lInitialCount 是该信号量的初始值.
  • lMaximumCount 是该信号量的最大值,该值大于 0.
  • lpName 是信号量的名称.如果该值为 NULL,那么这个信号量就只能在相同进程的不同线程之间共享.否则,就可以在不同的进程之间进行共享.
这个函数创建信号量,并返回这个信号量的句柄.它还将初始值设置为调用中指定的值.这样就可以允许有限个线程来访问某个共享资源. 在 Linux 中,可以使用 sem_init() 来创建一个无名的 POSIX 信号量,这个调用可以在相同进程的线程之间使用.它还会对信号量计数器进行初始化:int sem_init(sem_t *sem, int pshared, unsigned int value).在这段代码中:
  • value(信号量计数器)是这个信号量的初始值.
  • pshared 可以忽略,在目前的实现中,POSIX 信号量还不能在进程之间进行共享.
这里要注意的是,最大值基于 demaphore.h 头文件中定义的 SEM_VALUE_MAX. 在 Linux 中,semget() 用于创建 System V 信号量,它可以在不同集成的线程之间使用.可以用它来实现与 Windows 中有名信号量相同的功能.这个函数返回一个信号量集标识符,它与一个参数的键值关联在一起.当创建一个新信号量集时,对于与 semid_ds 数据结构关联在一起的信号量,semget() 要负责将它们进行初始化,方法如下:
  • sem_perm.cuidsem_perm.uid 被设置为调用进程的有效用户 ID.
  • sem_perm.cgidsem_perm.gid 被设置为调用进程的有效组 ID.
  • sem_perm.mode 的低 9 位被设置为 semflg 的低 9 位.
  • sem_nsems 被设置为 nsems 的值.
  • sem_otime 被设置为 0.
  • sem_ctime 被设置为当前时间.
用来创建 System V 信号量使用的代码是:int semget(key_t key, int nsems, int semflg).下面是对这段代码的一些解释:
  • key 是一个惟一的标识符,不同的进程使用它来标识这个信号量集.我们可以使用 ftok() 生成一个惟一的键值.IPC_PRIVATE 是一个特殊的 key_t 值;当使用 IPC_PRIVATE 作为 key 时,这个系统调用就会只使用 semflg 的低 9 位,但却忽略其他内容,从而新创建一个信号量集(在成功时).
  • nsems 是这个信号量集中信号量的数量.
  • semflg 是这个新信号量集的权限.要新创建一个信号量集,您可以将使用 IPC_CREAT 来设置位操作或访问权限.如果具有该 key 值的信号量集已经存在,那么 IPC_CREAT/IPC_EXCL 标记就会失败.
注意,在 System V 信号量中,

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号