Как сделать упорядочивание в мьютексе? - PullRequest
1 голос
/ 27 января 2012
#include "stdafx.h"
#include <Windows.h>
#include <conio.h>
#include <fstream>
#include <iostream>
using namespace std;

int main ( int, char ** )
{
    HANDLE mutex = CreateMutex(NULL, FALSE, L"PRV");

    for (int j=0; j < 100; ++j)
    {
        WaitForSingleObject(mutex, INFINITE);

        ofstream file("c:\\write.txt", ios::app);
        for (int i=0; i < 10; ++i) {
            file << 1;
        }
        ReleaseMutex(mutex);
        Sleep(100);
    }

    CloseHandle(mutex);
}

Я создаю 4 пограммы с file << 1 ... file << 4, и они работают, но мне нужно упорядочить по типу "круговой".Или, по крайней мере, без записи одного процесса дважды подряд.

1 Ответ

1 голос
/ 04 февраля 2012

Я не думаю, что вы можете достичь своей цели с помощью одного мьютекса, но вы можете довольно легко использовать два мьютекса, чтобы убедиться, что ни один процесс никогда не записывает дважды в последовательности. Вам нужно всегда иметь один процесс в очереди ожидания и один процесс в состоянии записи. Для этого вы создаете два мьютекса, назовем их queueMutex и writeMutex. Логика итерации в псевдокоде должна выглядеть следующим образом:

acquire(queueMutex) // The process is next to write
acquire(writeMutex) // The process can now write
release(queueMutex) // Some other process can enter the queue

// now we can write 
write_to_file()

// Let's hold on here until some other process 
// enters the queue
// we do it by trying to acquire the queueMutex
// until the acquisition fails
while try_acquire(queueMutex)
    release(queueMutex)
    sleep

// try_acquire(queueMutex) finally failed
// this means some other process has entered the queue
// we can release the writeMutex and finish this iteration
release(writeMutex)

Я оставлю детали реализации до вас. При реализации алгоритма убедитесь, что вы правильно обрабатываете последнюю итерацию для последнего процесса, иначе он зависнет. Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...