【发布时间】:2019-01-04 03:11:48
【问题描述】:
我想在一个循环中创建一个线程,并且在创建线程时,在线程完成之前不要再次创建它。我使用下面的代码,但它不起作用,因为互斥锁将在它已经解锁时解锁。谁能告诉我怎么做?
#include <iostream>
#include <thread>
#include <mutex>
int counter = 0;
std::mutex mtx;
std::thread t;
void test_mutex_t2()
{
std::lock_guard<std::mutex> lock(mtx);
counter++;
}
void test_mutex_t1()
{
while (1) {
if (mtx.try_lock())
{
t = std::thread(test_mutex_t2);
mtx.unlock();
}
}
}
int main()
{
test_mutex_t1();
return 0;
}
【问题讨论】:
-
你为什么用
try_lock()而不是lock()? -
什么意思,"互斥锁在它已经解锁的时候会解锁"
-
听起来你只想要一个线程运行,对吗?如果是这样,创建线程然后在循环结束时调用其
join方法的循环似乎更简单。 -
我只想创建一个线程来做大量的事情,比如图像识别,但是主循环不能被阻塞,当一个线程创建时,主循环不能创建另一个线程。感谢您的通知。
-
你可以保持你的线程运行,只要它完成它的工作就交给它一批新的数据? (查找“生产者消费者”)
标签: c++ multithreading mutex