我有一个要求在std :: thread退出时执行回调函数,并且回调函数应该在主线程上执行。std :: thread在主线程上执行回调函数
在创建线程时,我需要分离线程并且不能阻塞线程完成的主循环执行。
我试图使用的std ::信号,但是这似乎并没有主线程
#include <thread>
#include <csignal>
#include <iostream>
std::thread::id main_thread_id;
void func2()
{
for(int i = 0; i < 10000000; i++)
{
// do something
}
}
void func()
{
for(int i = 0; i < 10; i++)
{
func2();
}
std::raise(SIGUSR1);
}
void callback(int signal)
{
std::cout << "SIGNAL: " << signal << " THREAD ID:" <<
std::this_thread::get_id() << std::endl;
bool b = std::this_thread::get_id() == main_thread_id;
std::cout << "IS EXECUTED ON MAIN THREAD: " << b << std::endl;
}
int main()
{
main_thread_id = std::this_thread::get_id();
std::cout << "MAIN THREAD ID: " << std::this_thread::get_id() << std::endl;
std::signal(SIGUSR1, callback);
std::thread t1(func);
t1.detach();
for(int i = 0; i < 20; i++)
{
func2();
}
if(t1.joinable())
t1.join();
}
结果我得到的是回调函数未在主线程执行上执行回调函数。请建议一种方法,我可以在线程退出时创建工作线程并在主线程上调用回调函数。
感谢您的帮助
检查'std :: signal(SIGUSR1,callback);'返回的值。在某些实现中可以禁用设置信号处理程序。在这种情况下,你将得到'SIG_ERR'(-1) – ikleschenkov
你不能只是停止一个线程(主线程或其他线程)死在它的轨道上,让它执行一些代码,然后恢复它,就像什么都没有发生。线程必须以检查要做的工作的方式编写,然后才能工作。例如,它可能是[生产者 - 消费者]中的消费者(https://www.cs.cornell.edu/courses/cs3110/2010fa/lectures/lec18.html)安排。 –