2009-08-05 131 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或其他。

相關問題