ожидание нескольких условных переменных в повышении?

не фиксируют изменений форматирования с изменениями кода

, Если Вы хотите реструктурировать пробел гигантского файла ( Управление + K + D ), прекрасный. Фиксируйте изменение форматирования отдельно от фактического логического изменения. То же идет, если Вы хотите переместить функции в файлах. Фиксируйте перемещение отдельно от фактического редактирования.

18
задан Glen 11 September 2009 в 12:53
поделиться

4 ответа

I don't believe you can do anything like this with boost::thread. Perhaps because POSIX condition variables don't allow this type of construct. Of course, Windows has WaitForMultipleObjects as aJ posted, which could be a solution if you're willing to restrict your code to Windows synchronization primitives.

Another option would to use fewer condition variables: just have 1 condition variable that you fire when anything "interesting" happens. Then, any time you want to wait, you run a loop that checks to see if your particular situation of interest has come up, and if not, go back to waiting on the condition variable. You should be waiting on those condition variables in such a loop anyways, as condition variable waits are subject to spurious wakeups (from boost::thread docs, emphasis mine):

void wait(boost::unique_lock& lock)
...
Effects:
Atomically call lock.unlock() and blocks the current thread. The thread will unblock when notified by a call to this->notify_one() or this->notify_all(), or spuriously. ...

12
ответ дан 30 November 2019 в 08:43
поделиться
alternative solutions?

Я не уверен в библиотеке Boost, но вы можете использовать функцию WaitForMultipleObjects для ожидания нескольких объектов ядра. Просто проверьте, помогает ли это.

0
ответ дан 30 November 2019 в 08:43
поделиться

Как указывает Манагу, использование нескольких условий может быть не лучшим решением. То, что вы хотите сделать, должно быть возможно реализовать с помощью семафоров.

0
ответ дан 30 November 2019 в 08:43
поделиться

Как уже ответил руководящий, вы можете использовать одно и то же переменную условию и проверять несколько «событий» (переменные BOOL) в вашем цикле. Однако одновременный доступ к этим переменным BOOL должен быть защищен с использованием того же Mutex, что использует конспер.

Так как я уже прошел через неприятности ввода этого примера кода для соответствующего вопроса , я репостем это здесь:

boost::condition_variable condvar;
boost::mutex mutex;
bool finished1 = false;
bool finished2 = false;

void longComputation1()
{
    {
        boost::lock_guard<boost::mutex> lock(mutex);
        finished1 = false;
    }
    // Perform long computation
    {
        boost::lock_guard<boost::mutex> lock(mutex);
        finished1 = true;
    }
    condvar.notify_one();
}

void longComputation2()
{
    {
        boost::lock_guard<boost::mutex> lock(mutex);
        finished2 = false;
    }
    // Perform long computation
    {
        boost::lock_guard<boost::mutex> lock(mutex);
        finished2 = true;
    }
    condvar.notify_one();
}

void somefunction()
{
    // Wait for long computations to finish without "spinning"
    boost::lock_guard<boost::mutex> lock(mutex);
    while(!finished1 && !finished2)
    {
        condvar.wait(lock);
    }

    // Computations are finished
}
11
ответ дан 30 November 2019 в 08:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: