如果我创建两个 std::thread,我如何确定哪个线程先结束
If I create two std::thread, how can I identify which thread ends first
我想创建两个 std::thread
进程。然后我想弄清楚哪个线程先结束,如果它仍然是 运行 则结束另一个线程(可能通过调用它的析构函数?)。我只想使用标准库。我猜我需要用 std::atomic
and/or std::future
做点什么,或者实现回调?
int process1( void );
int process2( void );
std::thread first (process1() );
std::thread second (process2() );
//check which thread is done first and call join() on that thread to end it nicely?
//kill the other thread if its not done or call join() if it is done?
在 C++ 中没有 standard/easy 终止线程的方法。它们不像进程。
如果您不介意让较慢的线程在后台完成,则将它们都 detach() 并在主线程中等待来自最快线程的 std::conditional_variable
通知。
或者 join() 它们,并定期检查每个线程中的 std::conditional_variable
以通知另一个线程已完成,然后通过提前返回来中止。
如果在销毁非空 std::thread
之前既没有调用 join() 也没有调用 detach() ,那么程序将终止。
您不能只从线程本身外部结束线程。您必须以某种方式向线程发出信号,表明它需要停止。例如,您可以使用 std::atomic_bool
来做到这一点。
像这样:
// thread-safe output
#define con_sync_out(m) do{std::ostringstream o; o<<m<<'\n'; std::cout<<o.str();}while(0)
#define con_sync_err(m) do{std::ostringstream o; o<<m<<'\n'; std::cerr<<o.str();}while(0)
// random numbers
template<typename Integer>
Integer random(Integer lo, Integer hi)
{
thread_local std::mt19937 mt{std::random_device{}()};
return std::uniform_int_distribution<Integer>(lo, hi)(mt);
}
// stuff to do
void do_work(char const* id, int a, int b, std::atomic_bool& done)
{
// check if done == true (signal to stop)
while(!done && a < b)
{
++a;
con_sync_out(id << ": " << a << "/" << b);
std::this_thread::sleep_for(std::chrono::milliseconds(random<int>(500, 1000)));
}
done = true;
}
int main()
{
std::atomic_bool done = false; // signal flag
std::thread t1(do_work, "A", random<int>(0, 10), random<int>(10, 20), std::ref(done));
std::thread t2(do_work, "B", random<int>(0, 10), random<int>(10, 20), std::ref(done));
t1.join();
t2.join();
}
我想创建两个 std::thread
进程。然后我想弄清楚哪个线程先结束,如果它仍然是 运行 则结束另一个线程(可能通过调用它的析构函数?)。我只想使用标准库。我猜我需要用 std::atomic
and/or std::future
做点什么,或者实现回调?
int process1( void );
int process2( void );
std::thread first (process1() );
std::thread second (process2() );
//check which thread is done first and call join() on that thread to end it nicely?
//kill the other thread if its not done or call join() if it is done?
在 C++ 中没有 standard/easy 终止线程的方法。它们不像进程。
如果您不介意让较慢的线程在后台完成,则将它们都 detach() 并在主线程中等待来自最快线程的 std::conditional_variable
通知。
或者 join() 它们,并定期检查每个线程中的 std::conditional_variable
以通知另一个线程已完成,然后通过提前返回来中止。
如果在销毁非空 std::thread
之前既没有调用 join() 也没有调用 detach() ,那么程序将终止。
您不能只从线程本身外部结束线程。您必须以某种方式向线程发出信号,表明它需要停止。例如,您可以使用 std::atomic_bool
来做到这一点。
像这样:
// thread-safe output
#define con_sync_out(m) do{std::ostringstream o; o<<m<<'\n'; std::cout<<o.str();}while(0)
#define con_sync_err(m) do{std::ostringstream o; o<<m<<'\n'; std::cerr<<o.str();}while(0)
// random numbers
template<typename Integer>
Integer random(Integer lo, Integer hi)
{
thread_local std::mt19937 mt{std::random_device{}()};
return std::uniform_int_distribution<Integer>(lo, hi)(mt);
}
// stuff to do
void do_work(char const* id, int a, int b, std::atomic_bool& done)
{
// check if done == true (signal to stop)
while(!done && a < b)
{
++a;
con_sync_out(id << ": " << a << "/" << b);
std::this_thread::sleep_for(std::chrono::milliseconds(random<int>(500, 1000)));
}
done = true;
}
int main()
{
std::atomic_bool done = false; // signal flag
std::thread t1(do_work, "A", random<int>(0, 10), random<int>(10, 20), std::ref(done));
std::thread t2(do_work, "B", random<int>(0, 10), random<int>(10, 20), std::ref(done));
t1.join();
t2.join();
}