Происходит ли блокировка мьютексов в том же порядке, в котором они запрашиваются?

В настоящее время я пытаюсь создать очень простой пул потоков, используя 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. Он разблокирует соответствующий мьютекс, чтобы поток мог заблокировать его и выполнить свою задачу. поток немедленно разблокирует его, чтобы ThreadPool мог заблокировать его снова, так что поток будет остановлен после выполнения своей задачи.

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

5
задан Xeo 28 January 2012 в 16:33
поделиться