Блокировки мьютекса происходят в том же порядке, в котором их спрашивают? - PullRequest
5 голосов
/ 28 января 2012

В настоящее время я пытаюсь создать очень простой пул потоков, используя std::thread. Чтобы поддерживать «живые» потоки после выполнения заданной задачи, я ассоциирую std::mutex с каждым из них.

Принцип примерно такой:

// Thread loop
while (1)
{
  m_oMutex->lock();
  m_oMutex->unlock();
  m_bAvailable = false;
  m_oTask();
  m_bAvailable = true;
}

// ThreadPool function which gives a task to a thread
void  runTask(boost::function<void ()> oTask)
{
  [...]
  m_oThreads[i]->setTask(oTask);
  m_oMutexes[i]->unlock(); // same mutex as thread's m_oMutex
  m_oMutexes[i]->lock();
}

Чтобы найти i, ThreadPool ищет объект потока с m_bAvailable, установленным в true. Он разблокирует соответствующий мьютекс, чтобы thread смог заблокировать его и выполнить свою задачу. thread немедленно разблокирует его, чтобы ThreadPool мог снова заблокировать его, поэтому thread будет остановлен после выполнения задачи.

Но вопрос в том, будут ли блокировки выполняться в том порядке, в котором их задают нити? Другими словами, если thread блокирует mutex, то ThreadPool разблокирует и снова блокирует, я уверен, что блокировка сначала будет передана thread? Если нет, есть ли способ обеспечить это?

1 Ответ

9 голосов
/ 28 января 2012

Нет, вы не можете гарантировать, что ваш цикл потока когда-либо получит блокировку с вашим примером как есть.Используйте условную переменную, чтобы сообщить циклу потока, что он должен проснуться и взять блокировку.Смотри std::condition_variable::wait(...).

Более подробную информацию по этой теме в целом можно найти здесь http://en.wikipedia.org/wiki/Condition_variable. Если вы использовали библиотеку pthread, эквивалентный вызов будет pthread_cond_wait в вашем "Thread loop "и pthread_cond_signal в вашей функции runTask.

...