Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;线程库,在完成前两个线程后启动线程 我需要一点帮助,我在C++中使用“线程”库,我想一起启动三个线程,线程1和2必须计算数据,并且我希望在完成前第三个线程。请举例说明_C++_Multithreading - Fatal编程技术网

C++;线程库,在完成前两个线程后启动线程 我需要一点帮助,我在C++中使用“线程”库,我想一起启动三个线程,线程1和2必须计算数据,并且我希望在完成前第三个线程。请举例说明

C++;线程库,在完成前两个线程后启动线程 我需要一点帮助,我在C++中使用“线程”库,我想一起启动三个线程,线程1和2必须计算数据,并且我希望在完成前第三个线程。请举例说明,c++,multithreading,C++,Multithreading,我必须启动3个线程,第三个线程必须在启动时被阻止,并在前一个线程完成工作后等待 #include <thread> void one() { /* ... */ } void two() { /* ... */ } void three() { //this one is blocked on start and waiting for finish previus } void f() { std::thread t1(one), t2(two), t3(thre

我必须启动3个线程,第三个线程必须在启动时被阻止,并在前一个线程完成工作后等待

#include <thread>

void one() { /* ... */ }
void two() { /* ... */ }
void three() { 

//this one is blocked on start and waiting for finish previus
}


void f()
{
    std::thread t1(one), t2(two), t3(three);
    t1.join();
    t2.join();
    t3.join();


}
#包括
void one(){/*…*/}
void two(){/*…*/}
无效三({
//这一个在开始和等待完成时被阻止
}
void f()
{
螺纹t1(一)、t2(二)、t3(三);
t1.join();
t2.连接();
t3.join();
}

不要启动第三个线程。两个工作线程完成后,只需在调用线程中继续:

#include <thread>

void do_work() { /* ... */ }

void f()
{
    std::thread t1(do_work), t2(do_work);
    t1.join();
    t2.join();

    // do final work here
}
#包括
void do_work(){/*…*/}
void f()
{
std::螺纹t1(做工作),t2(做工作);
t1.join();
t2.连接();
//在这里做最后的工作
}

您要做的是连接前两个线程,然后在该指令完成时踢第三个线程。您可以看到一个很好的例子,除非您的应用程序保持运行(或是后台进程),否则其他答案应该足够了。这就是你问题中缺少的信息

然而,如果是上述情况,那么您将如何进行:

当某些数据可用时,您的前两个线程将唤醒并开始工作。一旦计算出所需的数据,它将向第三个线程发送一条消息。根据第三个线程正在执行的操作,它要么立即开始处理消息,要么将其排队,以便稍后处理


因此,在这个场景中,关键是消息传递和排队。

一个线程在用函子构造后立即启动。因此,如果您不想在前两个步骤完成之前启动
three()
,您只需延迟构建:

void f()
{
    std::thread t1(one), t2(two);
    t1.join();
    t2.join();

    // ok, 1 and 2 are done, start 3
    std::thread t3(three);
    t3.join();

    // all 3 are done
}
如果您真的想启动线程并阻塞直到t1/t2完成,那么您需要执行以下操作:

void f()
{
    std::condition_variable cv; 
    std::mutex m;

    std::thread t1(one), t2(two);
    std::thread t3([&]{
        std::unique_lock<std::mutex> lk(m);
        cv.wait(lk);

        three();
    });
    t1.join();
    t2.join();

    // ok, 1 and 2 are done, start 3
    {
        // I don't think the lock here is strictly necessary
        std::unique_lock<std::mutex> lk(m);
        cv.notify_all();
    }

    t3.join();
    // all 3 are done
}
void f()
{
std::条件变量cv;
std::互斥m;
标准:螺纹t1(一个),t2(两个);
标准:线程t3([&]{
std::唯一锁lk(m);
cv.等待(lk);
三个();
});
t1.join();
t2.连接();
//好的,1和2都完成了,开始3
{
//我认为这里的锁不是绝对必要的
std::唯一锁lk(m);
cv.通知所有人();
}
t3.join();
//所有3个都完成了
}

你们知道自己的思路,但你们没有读过问题。在所有线程完成之前,他没有说过要关闭主程序。只有t3需要等待

代码应仅启动t3。 t3应启动t1和t2 使用t1.join()等待它们;t2.连接();
然后执行它的代码。

我编辑了我的问题。如果三个线程必须从主程序启动,这就是答案。我假设t1和t2都与t3共享一个std::condition_变量。