如何使一个互斥体的3个进程自动交换?

我有3个程序,每个程序需要在一个文件中写入1000次。 每10次写入之后,互斥锁必须切换程序

#include "stdafx.h" #include <Windows.h> #include <fstream> #include <iostream> using namespace std; HANDLE ghMutex; void write() { ghMutex = OpenMutex(SYNCHRONIZE, false, (LPTSTR)"WriteData"); for (int i=0; i<100; i ++) { WaitForSingleObject(ghMutex, INFINITE); ofstream f1("c:\\write.txt", ios_base::app); for (int j=0; j<10; j++) f1 << 2; ReleaseMutex(ghMutex); f1.close(); Sleep(100); } } void main(){ write(); } 

第一个程序用“f1 << 1”,第二个用“f1 << 2”它们不同步,怎么做? 请帮助我开始2个程序。

Solutions Collecting From Web of "如何使一个互斥体的3个进程自动交换?"

从您的描述中确切地说明您希望程序的行为如何。 你是否希望程序保证进程是交替的,如果是的话,你需要一个循环类型的排序(例如进程1,然后进程2,然后进程3,然后再进程1)?

但是,很显然你当前的互斥使用是不正确的。 首先,至少有一个进程必须调用CreateMutex()才能真正创建互斥锁(否则不会有互斥锁打开)。 由于CreateMutex()的文档说:

如果lpName匹配现有的已命名mutex对象的名称,则此函数请求MUTEX_ALL_ACCESS访问权限。

假设请求更多的访问对你来说不是一个问题(它很少),那么你可以让所有实例调用CreateMutex()确保它们都共享相同的互斥量,并且首先实际创建的是最初的实例。

这是一个以不可预知的顺序交替进行的简单示例(允许重复),但是可以连续10次正确写入文件,而不会被并发作者中断。

 #include <Windows.h> #include <conio.h> #include <iostream> #include <fstream> int main ( int, char ** ) { // get a named mutex. open the same mutex as other // concurrent instances. const ::HANDLE mutex = ::CreateMutexW(0, FALSE, L"Fubar"); if (mutex == INVALID_HANDLE_VALUE) { const ::DWORD error = ::GetLastError(); std::cerr << "Could not open mutex (" << error << ")." << std::endl; return (EXIT_FAILURE); } // open the input file. notice the flags, you need to make // sure the 2nd process doesn't overwrite whatver the first // wrote, etc. std::ofstream file("foo.txt", std::ios::app); if (!file.is_open()) { std::cerr << "Could not open file." << std::endl; return (EXIT_FAILURE); } // wait for user to unblock after launch. this gives time // to start concurrent processes before we write to the // file. ::getch(); // not sure how your application goes, but lets just // repeatedly write to the file until we're fed up. for (int j=0; j < 100; ++j) { // lock the mutex around the code that writes to the // file in a loop. ::WaitForSingleObject(mutex, INFINITE); for (int i=0; i < 10; ++i) { file << "process " << ::GetCurrentProcessId() << std::endl; } ::ReleaseMutex(mutex); // slow down so the application doesn't finish before we // unblock concurrent instances. ::Sleep(100); } // don't forget to clean up! ::CloseHandle(mutex); } 

启动该进程的多个实例(2个或更多),当启动所有进程时,在每个控制台窗口中按一个键以使进程开始写入。 输出文件将包含每个进程10个输出的burts。

ghMutex在任何进程中都有效吗? 在OpenMutex()WaitForSingleObject()之后GetLastError()返回的值怎么样?

您需要在其中一个进程中创建互斥锁,然后其他进程才能打开它。 幸运的是, CreateMutex正是你所需要的:它创建互斥体,如果它不存在,并打开它,如果这样做。

而且您可能希望在释放互斥锁之前(而非之后)关闭流,以便在其他进程开始写入之前刷新缓存的数据。