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