快速业务通道

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

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-28
key 被用来惟一标识信号量;在 Windows 中,信号量是使用一个名称来标识的. 为了对信号量集数据结构进行初始化,可以使用 IPC_SET 命令来调用 semctl() 系统调用.将 arg.buf 所指向的 semid_ds 数据结构的某些成员的值写入信号量集数据结构中,同时更新这个结构的 sem_ctime member 的值.用户提供的这个 arg.buf 所指向的 semid_ds 结构如下所示:
  • sem_perm.uid
  • sem_perm.gid
  • sem_perm.mode (只有最低 9 位有效)
调用进程的有效用户 ID 应该是超级用户,或者至少应该与这个信号量集的创建者或所有者匹配: int semctl(int semid, int semnum, int cmd = IPC_SET, ...).在这段代码中:
  • semid 是信号量集的标识符.
  • semnum 是信号量子集偏移量(从 0 到 nsems -1,其中 n 是这个信号量集中子集的个数).这个命令会被忽略.
  • cmd 是命令;它使用 IPC_SET 来设置信号量的值.
  • args 是这个信号量集数据结构中要通过 IPC_SET 来更新的值(在这个例子中会有解释).
最大计数器的值是根据在头文件中定义的 SEMVMX 来决定的. 打开信号量 在 Windows 中,我们使用 OpenSemaphore() 来打开某个指定信号量.只有在两个进程之间共享信号量时,才需要使用信号量.在成功打开信号量之后,这个函数就会返回这个信号量的句柄,这样就可以在后续的调用中使用它了.
HANDLE OpenSemaphore(

  DWORD dwDesiredAccess,

  BOOL bInheritHandle,

  LPCTSTR lpName

)

在这段代码中:
  • dwDesiredAccess 是针对该信号量对象所请求的访问权.
  • bInheritHandle 是用来控制这个信号量句柄是否可继承的标记.如果该值为 TRUE,那么这个句柄可以被继承.
  • lpName 是这个信号量的名称.
在 Linux 中,可以调用相同的 semget() 来打开某个信号量,不过此时 semflg 的值为 0:int semget(key,nsems,0).在这段代码中:
  • key 应该指向想要打开的信号量集的 key 值.
  • 为了打开一个已经存在的信号量,可以将 nsems 和标记设置为 0.semflg 值是在返回信号量集标识符之前对访问权限进行验证时设置的.
获取信号量 在 Windows 中,等待函数提供了获取同步对象的机制.可以使用的等待函数有多种类型;在这一节中,我们只考虑 WaitForSingleObject()(其他类型将会分别进行讨论).这个函数使用一个信号量对象的句柄作为参数,并会一直等待下去,直到其状态变为有信号状态或超时为止. DWORD WaitForSingleObject( HANDLE hHandle, DWORD dwMilliseconds ); 在这段代码中:
  • hHandle 是指向互斥句柄的指针.
  • dwMilliseconds 是超时时间,以毫秒为单位.如果该值是 INFINITE,那么它阻塞调用线程/进程的时间就是不确定的.
在 Linux 中,sem_wait() 用来获取对信号量的访问.这个函数会挂起调用线程,直到这个信号量有一个非空计数为止.然后,它可以原子地减少这个信号量计数器的值:. 这个命令将立即删除信号量集及其数据结构,并唤醒所有正在等待的进程(如果发生错误,则返回,并将 errno 设置为 EIDRM).调用进程的有效用户 ID 是超级用户,或者可以与该信号量集的创建者或所有者匹配的用户.参数 semnum 会被忽略.

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号