如何在pthreads平台上进行异步线程间通信

时间:2009-05-15 20:24:39

标签: multithreading unix asynchronous

例如在Windows上有MsgWaitForMultipleObjects,它允许您异步等待Windows消息,套接字事件,异步io(IOCompletionRoutine)和互斥锁句柄。

在Unix上,你有select / poll,除了在某些pthread_mutex被解锁时爆发的可能性外,你还可以获得一切。

故事:

我的应用程序有主线程,可以处理多个套接字,管道或文件。现在不时有一个副作业(数据库事务)可能需要更长的时间,如果在主线程中同步完成将中断套接字的正常服务。所以我想在单独的线程中执行db操作。该线程在空闲时会等待一些互斥锁,直到主线程决定给它一些工作并解锁互斥锁,因此db线程可以抓住它。 问题是数据库线程如何通知主线程它已完成作业。主线程必须处理套接字,因此在pthread_mutex_lock中无法承受睡眠。定期执行pthread_mutex_trylock是我想要做的最后一次。目前我考虑使用管道,但这是更好的方法吗?

2 个答案:

答案 0 :(得分:1)

在这里使用烟斗是一个好主意。确保没有其他进程打开管道的写入结束,然后在主线程中选择()或poll()读取结束。完成工作线程后,关闭()写入结束。主线程中的select()立即唤醒。

我不认为等待互斥体和其他东西是可能的,因为在Linux上,互斥体是使用futex(2)系统调用实现的,它不支持文件描述符。

答案 1 :(得分:0)

我不知道它对你的具体问题有多好,但posix有message queues