我在编程一个进程间通信模块(进程A和进程B)。从C++中的另一个进程解锁一个线程
只要进程A完成特定动作,B中的通信线程是否可以运行(解锁),我的意思是没有B做任何轮询,也没有B在完成其动作后等待太多?
哪些是管理这些问题的概念/模型/设计模式? (比进程间同步更精确)。你推荐哪些图书馆/方法?
谢谢。
编辑:我正在寻找适用于三种主要操作系统中的每一种的方法:Ms Windows,Apple Mac OS X,GNU/Linux。
我在编程一个进程间通信模块(进程A和进程B)。从C++中的另一个进程解锁一个线程
只要进程A完成特定动作,B中的通信线程是否可以运行(解锁),我的意思是没有B做任何轮询,也没有B在完成其动作后等待太多?
哪些是管理这些问题的概念/模型/设计模式? (比进程间同步更精确)。你推荐哪些图书馆/方法?
谢谢。
编辑:我正在寻找适用于三种主要操作系统中的每一种的方法:Ms Windows,Apple Mac OS X,GNU/Linux。
这是很辛苦的工作:
对于Unix操作系统,你可以使用:
并行线程条件和互斥与setpshared说法。
注意:它是在Linux 2.6,在Solaris下可以很好地支持,但它不支持FreeBSD和Cygwin的(不知道有关Mac OS X)
对于Unix系统中,你也可以使用名称的信号,但我不知道他们
这是艰苦的工作,特别是对IPC ...
所以,如果你想移动式的东西e,我建议看一看有条件和互斥的Boost.Interprocess ...
但是确保您要支持的所有操作系统都支持所有功能。
事情您应该注意Boost.Interprocess中
仔细检查水平的每个UNIX操作系统,你需要使用的支持,因为加速。Interprosess使用并不总是支持的pthread_ *函数...然后失败回到仿真 - 检查这种仿真的质量
此外,检查这些东西如何在Windows上工作 - 据我所知,存在Win32 API中没有“in-shared-memory”互斥体,通常应该使用命名对象,因此请检查支持的内容和方式。
如果您的操作系统支持信号,您可以从信号处理程序中解锁互斥体,并在完成任务后立即发送来自过程A的信号。
进程B将等待互斥锁或其他同步工具,并且A将处理任何事情,然后当完成发送信号USR1时,例程B中的USR1处理程序解锁对应的同步工具。
最常见的是使用select()/ poll()。如果有可用输入,它们都可以检查多个文件描述符。两者都会收到一个超时参数 - 这将防止繁忙的等待,这可能会消耗100%的CPU。这对于小型/中型应用非常合适。
另一种方法是在单独的线程中进行轮询。
如果您打算开发一个大型应用程序,那么可以考虑使用ACE framework或 boost。这些框架是跨平台的解决方案,设计良好并经过良好测试。
感谢您的答案,但我的意思是“没有B做任何投票”。也许select()更合适? – moala 2009-08-05 09:12:57
编辑:我误以为你需要不同的线程同步,修订了IPC
我想你需要这样的东西可等待的事件。
在Windows中,您可以使用CreateEvent()
创建(或获取现有的)已命名的自动重置事件。
当进程A完成处理时,它应该调用SetEvent()
,而进程B应该调用WaitForSingleObject()
休眠直到完成(或超时)。
或者,可以通过调用ReleaseSemaphore()
使用由CreateSemaphore()
创建信号量,初始化为0。 方法A发出完成信号,而处理B再次使用WaitForSingleObject()
等待完成。
在Linux和OS X下,您可以使用信号量达到类似的效果。 使用sem_open()
创建一个命名信号量,其初始值为0。
当进程A完成时,它应该调用sem_post()
来增加信号量,而进程B应该调用sem_wait()
来休眠直到完成。
注意:信号灯方法可允许多个完成用信号,你应该在Windows下设置最大计数,或sem_getvalue()
我想检查理智当前SEM值处理这个问题条件变量适合你想要做什么,这里将在Linux和OSX
#include <pthread.h>
/* no error checking, quick and dirty sample */
pthread_mutex_t g_mutex;
pthread_cond_t g_cond;
int a_done = 0;
void init(void)
{
pthread_mutex_init(&g_mutex, NULL);
pthread_cond_init(&g_cond, NULL);
}
void thread_a(void *arg)
{
/* do something here... */
pthread_mutex_lock(&g_mutex);
a_done = 1;
pthread_cond_signal(&g_cond);
pthread_mutex_unlock(&g_mutex);
}
void thread_b(void *arg)
{
/* wait for a to complete */
pthread_mutex_lock(&g_mutex);
while (!a_done)
pthread_cond_wait(&g_cond, &g_mutex);
a_done = 0;
pthread_mutex_unlock(&g_mutex);
}
工作在Windows下的样本,就可以使用pthreads-win32,或Vista下的本地条件变量,请参阅MSDN Condition Variables页面以获取更多信息。
参考文献:
我误解了这个问题,认为这是一个线程间问题。我已经添加了有关如何在进程之间执行此操作的信息,希望有所帮助 – Hasturkun 2009-08-17 07:23:06