2009-08-05 129 views
0

我在编程一个进程间通信模块(进程A和进程B)。从C++中的另一个进程解锁一个线程

只要进程A完成特定动作,B中的通信线程是否可以运行(解锁),我的意思是没有B做任何轮询,也没有B在完成其动作后等待太多?

哪些是管理这些问题的概念/模型/设计模式? (比进程间同步更精确)。你推荐哪些图书馆/方法?

谢谢。

编辑:我正在寻找适用于三种主要操作系统中的每一种的方法:Ms Windows,Apple Mac OS X,GNU/Linux。

+0

我误解了这个问题,认为这是一个线程间问题。我已经添加了有关如何在进程之间执行此操作的信息,希望有所帮助 – Hasturkun 2009-08-17 07:23:06

回答

2

这是很辛苦的工作:

对于Unix操作系统,你可以使用:

  • 并行线程条件和互斥与setpshared说法。

    注意:它是在Linux 2.6,在Solaris下可以很好地支持,但它不支持FreeBSD和Cygwin的(不知道有关Mac OS X)

  • 对于Unix系统中,你也可以使用名称的信号,但我不知道他们

  • 的支撑位对于Windows有一些事件...

这是艰苦的工作,特别是对IPC ...

所以,如果你想移动式的东西e,我建议看一看有条件和互斥的Boost.Interprocess ...

但是确保您要支持的所有操作系统都支持所有功能。

事情您应该注意Boost.Interprocess中

仔细检查水平的每个UNIX操作系统,你需要使用的支持,因为加速。Interprosess使用并不总是支持的pthread_ *函数...然后失败回到仿真 - 检查这种仿真的质量

此外,检查这些东西如何在Windows上工作 - 据我所知,存在Win32 API中没有“in-shared-memory”互斥体,通常应该使用命名对象,因此请检查支持的内容和方式。

0

如果您的操作系统支持信号,您可以从信号处理程序中解锁互斥体,并在完成任务后立即发送来自过程A的信号。

进程B将等待互斥锁或其他同步工具,并且A将处理任何事情,然后当完成发送信号USR1时,例程B中的USR1处理程序解锁对应的同步工具。

+0

看起来它是POSIX;你见过适用于Windows的吗? – moala 2009-08-05 09:17:10

+0

不知道您是否可以在Windows中正确使用信号,但是我知道您还有其他选择,因为Windows事件并未使用它们。 – 2009-08-05 09:27:20

+0

没有没有这样的事情作为可靠的posix信号在窗户上... – neuro 2009-08-10 15:09:44

0

最常见的是使用select()/ poll()。如果有可用输入,它们都可以检查多个文件描述符。两者都会收到一个超时参数 - 这将防止繁忙的等待,这可能会消耗100%的CPU。这对于小型/中型应用非常合适。

另一种方法是在单独的线程中进行轮询。

如果您打算开发一个大型应用程序,那么可以考虑使用ACE frameworkboost。这些框架是跨平台的解决方案,设计良好并经过良好测试。

+0

感谢您的答案,但我的意思是“没有B做任何投票”。也许select()更合适? – moala 2009-08-05 09:12:57

1

编辑:我误以为你需要不同的线程同步,修订了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页面以获取更多信息。

参考文献:

0

嗯,在我看来和经验,做的最好的方式,在便携和简单的方法就是用插座。另外你可以在不同的机器上安装这两个进程(如果需要的话)。另外,你可以通过通信来处理超过同步。

如果您不想轮询,请使用等待套接字上的同步消息的线程。你用阻塞的方式读取套接字。当您收到消息时,您将使用标准的多线程同步来处理您的同步。在你的情况下,因为B应该等到A结束,你只需要在你的过程中以阻塞的方式阅读。

要便携使用便携式套接字库,如boostptypes或其他。

相关问题