快速业务通道

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

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-28
被继承.
  • lpName 是一个指向事件对象名的指针.
    Empire CMS,phome.net
  • 在 Linux 中,可以调用 sem_init() 来创建一个 POSIX 信号量:int sem_init(sem_t *sem, int pshared, unsigned int value)(其中 value(即信号量计数值)被设置为这个信号量的初始状态). Linux pthreads 使用 pthread_cond_init() 来创建一个条件变量:int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr). 可以使用 PTHREAD_COND_INITIALIZER 常量静态地对 pthread_cond_t 类型的条件变量进行初始化,也可以使用 pthread_condattr_init() 对其进行初始化,这个函数会对与这个条件变量关联在一起的属性进行初始化.可以调用 pthread_condattr_destroy() 用来销毁属性:
    int pthread_condattr_init(pthread_condattr_t *attr)
    
    int pthread_condattr_destroy(pthread_condattr_t *attr)
    
    

    等待某个事件 在 Windows 中,等待函数提供了获取同步对象的机制.我们可以使用不同类型的等待函数(此处我们只考虑 WaitForSingleObject()).这个函数会使用一个互斥对象的句柄,并一直等待,直到它变为有信号状态或超时为止.
    Empire CMS,phome.net
    DWORD WaitForSingleObject(
    
      HANDLE hHandle,
    
      DWORD dwMilliseconds
    
    );
    
    
    在这段代码中:
    • hHandle 是指向互斥句柄的指针.
    • dwMilliseconds 是超时时间的值,单位是毫秒.如果该值为 INFINITE,那么它阻塞调用线程/进程的时间就是不确定的.
    Linux POSIX 信号量使用 sem_wait() 来挂起调用线程,直到信号量的计数器变成非零的值为止.然后它会自动减小信号量计数器的值:int sem_wait(sem_t * sem). 在 POSIX 信号量中并没有提供超时操作.这可以通过在一个循环中执行非阻塞的 sem_trywait() 来实现,该函数会对超时时间进行计数:int sem_trywait(sem_t * sem). Linux pthreads 使用 pthread_cond_wait() 来阻塞调用线程,其时间是不确定的:int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex).在另外一方面,如果调用线程需要被阻塞一段确定的时间,那么就可以使用 pthread_cond_timedwait() 来阻塞这个线程.如果在这段指定的时间内条件变量并没有出现,那么 pthread_cond_timedwait()
    Empire CMS,phome.net
    就会返回一个错误:int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex,const struct timespec *abstime).在这里,abstime 参数指定了一个绝对时间(具体来说,就是从 1970 年 1 月 1 日 0 时 0 分 0 秒到现在所经过的时间.)
    改变事件对象的状态 函数 SetEvent() 用来将事件对象的状态设置为有信号状态.对一个已经设置为有信号状态的事件对象再次执行该函数是无效的.
    BOOL SetEvent(
    
      HANDLE hEvent
    
    )
    
    
    Linux POSIX 信号量使用 sem_post() 来发出一个事件信号量.这会唤醒在该信号量上阻塞的所有线程:int sem_post(sem_t * sem). 调用 pthread_cond_signal() 被用在 LinuxThreads 中,以唤醒在某个条件变量上等待的一个线程,而 pthread_cond_broadcast() 用来唤醒在某个条件变量上等待的所有线程.
    int pthread_cond_signal(pthread_cond_t *cond)
    
    int pthread_cond_broadcast(pthread_cond_t *cond)
    
    
    注意,条件函数并不是异步信号安全的,因此不能在信号处理函数中调用.具体地说,在信号处理函数中调用
    Empire CMS,phome.net
    有名事件对象 在 Linux 中,进程之间有名事件对象所实现的功能可以使用 System V 信号量实现.System V 信号量是计数器变量,因此可以实现 Windows 中事件对象的功能,信号量的计数器的初始值可以使用 semctl() 设置为 0. 要将某个事件的状态修改为有信号状态,可以使用 semop(),并将 sem_op 的值设置为 1.要等待某个事件,则可以使用 semop() 函数,并将 sem_op 的值设置为 -1,这样就可以阻塞调用进程,直到它变为有信号状态为止. 可以通过使用 semctl() 将信号量计数器的初始值设置为 0 来获得信号量.在使用完共享资源之后,可以使用 semop() 将信号量计数设置为 1.关于每个 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号