我正在開發兩個使用檔案進行通信的應用程式。這些應用程式在同一臺機器上運行。需要明確的是,我有一個writer.exe和一個reader.exe可執行檔案。
在writer.exe不斷地寫了一個隨機整數一個共同檔案"some_file.bin",并關閉檔案。它再次重復相同的程序:打開檔案,隨機寫入int并關閉它。這是在 while 回圈中完成的。
在reader.exe不斷讀取檔案"some_file.bin",列印讀整數其控制臺。
這兩個應用程式都是用 C 撰寫的,使用std::fstream檔案 I/O 類。
到目前為止,這不能正常作業,因為我們在這里發生了競爭條件。
我想要一些方法來使用 Win32 事件在這兩個行程之間正確通信,以便writer.exe行程知道等待reader.exe行程完成讀取,并且reader.exe行程知道暫停直到writer.exe行程完成寫入。
我希望能做到這一點使用CreateEvent,WaitForSingleObject家庭API呼叫本機目前在Windows平臺上。
請隨時告訴我這是否可以在兩個行程之間進行?
到目前為止,我只找到了使用上述 API 來向一個主行程的執行緒發送信號的示例......?
uj5u.com熱心網友回復:
是的,這是可能的。當一個行程創建一個 Event 物件的句柄時,您可以選擇在內核中為該物件分配一個名稱。然后另一個行程可以使用相同的名稱創建/打開它自己的該事件物件的句柄。
請注意,要完成您想要的操作,您實際上需要 2 個事件,例如:
作家.exe:
HANDLE hReadable = CreateEvent(NULL, FALSE, FALSE, TEXT("ReaderCanRead"));
if (!hReadable) ...
HANDLE hWritable = CreateEvent(NULL, FALSE, TRUE, TEXT("WriterCanWrite"));
if (!hWritable) ...
...
while (!quit)
{
...
WaitForSingleObject(hWritable, INFINITE);
if (quit) break;
// write int...
SetEvent(hReadable);
...
}
閱讀器.exe:
HANDLE hReadable = CreateEvent(NULL, FALSE, FALSE, TEXT("ReaderCanRead"));
// or: HANDLE hReadable = OpenEvent(SYNCHRONIZE, FALSE, TEXT("ReaderCanRead"));
if (!hReadable) ...
HANDLE hWritable = CreateEvent(NULL, FALSE, TRUE, TEXT("WriterCanWrite"));
// or: HANDLE hWritable = OpenEvent(EVENT_MODIFY_STATE, FALSE, TEXT("WriterCanWrite"));
if (!hWritable) ...
...
while (!quit)
{
...
WaitForSingleObject(hReadable, INFINITE);
if (quit) break;
// read int...
SetEvent(hWritable);
...
}
話雖如此,您可能會考慮通過CreateFileMapping() MapViewOfFile()使用共享記憶體的命名塊,而不是使用物理檔案。
但是,與使用受事件保護的共享檔案/記憶體相比,還有許多其他行程間通信機制更適合您的生產者/消費者模型。管道、套接字、郵槽,甚至視窗訊息,都是更好的選擇。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/364068.html
