c++ - C++ 11中线程的延迟启动

标签 c++ multithreading c++11

我正在进入 C++11 线程并遇到了问题。

我想将一个线程变量声明为全局变量并稍后启动它。

但是,我看到的所有示例似乎都立即启动了线程

thread t(doSomething);

我想要的是

thread t;

稍后再启动线程。

我试过的是

if(!isThreadRunning)
{
    thread t(readTable);
}

但现在 t 是 block 作用域。所以我想声明 t,然后再启动线程,以便其他函数可以访问 t。

感谢您的帮助。

最佳答案

std::thread 的默认构造函数实例化 std::thread 而不启动或表示任何实际线程。

std::thread t;

赋值操作符移动线程对象的状态,并将分配的线程对象设置为其默认初始化状态:

t = std::thread(/* new thread code goes here */);

这首先构造一个表示新线程的临时线程对象,将新线程表示转移到具有默认状态的现有线程对象中,并将临时线程对象的状态设置为不表示任何正在运行的线程的默认状态。然后临时线程对象被销毁,什么都不做。

这是一个例子:

#include <iostream>
#include <thread>

void thread_func(const int i) {
    std::cout << "hello from thread: " << i << std::endl;
}

int main() {
    std::thread t;
    std::cout << "t exists" << std::endl;

    t = std::thread{ thread_func, 7 };
    t.join();

    std::cout << "done!" << std::endl;
}

关于c++ - C++ 11中线程的延迟启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25524775/

相关文章:

c++ - 在类中使用指针时遇到问题

c# - 为 Node.js 应用程序创建 COM API 或类似的 API

c++ - 通过引用 c++ 删除对象

c++ - SurfDescriptorExtractor/featureDetector - IOS 中的 OpenCv

java - 多线程声明期间静态变量初始化

c++ - Boost:如何创建一个线程以便可以控制它的所有标准输出、标准错误?

c++ - 在 Linux 上的多线程 C++ 应用程序中检测堆栈溢出/覆盖

c++ - 任何人都可以解释 boost::thread 的这个意外结果吗?

c++ - unique_ptr 和默认可构造指针

c++ - C++11 中的用户定义属性?