我在編程一個進程間通信模塊(進程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