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