Похоже, что вы на самом деле хотите, чтобы в любой момент работал ровно один фоновый поток.Если это правда, я бы предложил полностью избавиться от блокировок, выбрав вместо этого join()
поток перед выходом из цикла.Примерно так:
while (true) {
auto thr = std::thread(test_mutex_t2);
thr.join(); // Will block until thread exits
}
Однако я также хотел бы отметить, что это означает, что у вас будет ровно один запущенный поток.Возникает вопрос: почему вы вообще используете потоки?Вы создаете дополнительные потоки только для синхронной работы.
Если вы действительно хотите использовать несколько потоков, вам нужен другой примитив синхронизации.По сути, мьютекс предназначен для защиты доступа к одному ресурсу.Что вы хотите сделать, это передать из фонового потока в основной поток, уведомив основной поток о том, что фоновый поток что-то сделал (в данном случае завершено).Обычно это выполняется с помощью условной переменной или семафора.Класс std::condition_variable
реализует первый из них.
Я бы порекомендовал передать функции потока переменную условия, которую он использует для оповещения основного потока о завершении.Примерно так:
void thread_func(std::condition_variable* cv) {
// do work
cv->notify_one();
}
int main(void) {
std::condition_variable cv;
std::mutex lock;
while (true) {
std::unique_lock<std::mutex> lock(mut);
auto thr = std::thread(thread_func, &cv);
cv.wait(lock); // Wait for background thread to notify us
thr.join();
}
}
Опять же, это слишком много для этого простого примера;Я бы использовал join()
метод, как указано выше.Но если вам нужен более сложный шаблон связи, когда основной поток должен ждать в нескольких местах фонового потока, переменная условия более подходит.