从std :: thread在主线程上执行回调函数

Tus*_*har 4 c++ multithreading pthreads boost-thread c++11

我要求在退出std :: thread时执行回调函数,并且应该在主线程上执行回调函数.

在线程创建时,我需要分离线程,并且不能阻止主循环执行以完成线程.

我尝试使用std :: signal,但似乎没有在主线程上执行回调函数

#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();
}
Run Code Online (Sandbox Code Playgroud)

我得到的结果是回调函数不在主线程上执行.请建议一种方法,我可以在线程退出时创建一个工作线程并在主线程上调用一个回调函数.

谢谢您的帮助

Yak*_*ont 10

有几种方法可以做到这一点.

首先,您的主线程可能正在运行消息循环.在这种情况下,你排队一个带有有效负载的消息,告诉主线程运行一些代码(要么通过消息的指针部分运行代码到主线程,要么把它放在主线程的某个已知位置)线程检查).

第二种方法是返回类似std::future<std::function<void()>>对象的东西,主线程检查未来是否准备就绪.准备就绪后,它会运行代码.

第三种方法是创建主线程等待的并发队列,并将您的消息(包含要运行的代码)填充到该队列中.

所有这些都需要主线程的积极配合.主线程无法预先设置并告知在没有合作的情况下运行不同的代码.

哪个最好取决于您在问题中没有选择提及的程序功能.如果您是带有消息循环的图形GUI,请使用消息循环.如果你是一个对某些工作进行并列化的流处理器,并且你不需要立即执行,但最终还是希望阻止并行工作,那么未来可能是最好的.如果您是传递频道类型应用的消息,则一组队列可能是最佳的.