Linux下关于互斥锁及同步的移植(二)
作者 佚名技术
来源 Linux系统
浏览
发布时间 2012-04-28
|
被继承.
lpName 是一个指向事件对象名的指针.
在 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() ).这个函数会使用一个互斥对象的句柄,并一直等待,直到它变为有信号状态或超时为止.
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() 就会返回一个错误: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)
|
注意,条件函数并不是异步信号安全的,因此不能在信号处理函数中调用.具体地说,在信号处理函数中调用 |
有名事件对象
在 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
为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
|
|
|