Как одновременно приостановить поток и разблокировать Mutex из этого потокаC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как одновременно приостановить поток и разблокировать Mutex из этого потока

Сообщение Anonymous »

У меня есть очередь заданий, которые следует выполнять асинхронно (на самом деле отправлять HTTP -запросы, если это имеет значение), и я хочу, чтобы поток исполнителя приостановил, пока новая задача не появится, если очередь пуст. Я надеюсь, что следующий фрагмент объяснит, что я хочу: < /p>

Код: Выделить всё

#include 

#include 
#include 
#include 
#include 
#include 
#include 

class Job{
};

std::queue jobs;
std::unique_ptr mutex = std::make_unique();
std::vector         threads;
std::vector         threadsEvents;
std::stack     freeThreads;
std::atomic_bool            stopRequested { false };

void DoJob(Job job = {})
{
}

void ThreadedMethod(const std::size_t threadNumber)
{
while (!stopRequested) {
mutex->lock();
if (!jobs.empty()) {
//auto job = queue.front();
//queue.pop();
mutex->unlock();
DoJob(/* std::move(job) */);
} else {
freeThreads.push(threadNumber);
mutex->unlock(); // 1)
// Unlocking before thread suspended.
::SetEvent(threadsEvents[threadNumber]); // Notify that thread will be suspended
::SuspendThread(threads[threadNumber]); // 2)
}
}
}

void addJob(Job job) {
std::lock_guard lock {*mutex};
jobs.push(job);
// Activate first available free thread
// ResumeThread(freeThreads.top());
// ...
}

/*
// Creating threads
//for (std::size_t i = 0; i < 10; ++i) {
//    Concidering the 'threadNumber' is stored somewhere.
//    threads[i] = CreateThread(NULL, 0, ThreadedMethod, (LPVOID)&threadNumber, CREATE_SUSPENDED, NULL);
//}
*/
В этом фрагменте ThreadedMethod , который работает с асинхронно, приостанавливает его поток, и я боюсь, что что -то может произойти между линиями 1) и 2) . Например, может появиться новая работа, и это может создать противоречивое состояние. Итак, я ищу способ каким -то образом приостановить поток и разблокировать мутекс «одновременно».>

Подробнее здесь: https://stackoverflow.com/questions/794 ... his-thread
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как одновременно приостановить поток и разблокировать Mutex из этого потока
    Anonymous » » в форуме C++
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • Как одновременно приостановить поток и разблокировать Mutex из этого потока
    Anonymous » » в форуме C++
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • Boost :: mutex :: ~ mutex (): утверждение `! pthread_mutex_destroy (& m) 'не удалось
    Anonymous » » в форуме C++
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • Как приостановить поток, используя идентификатор потока?
    Anonymous » » в форуме JAVA
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Минимальный рабочий пример аннотаций анализа безопасности потока Clang для std :: mutex [Duplicate]
    Anonymous » » в форуме C++
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»