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++ - QSignalSpy 和 std::shared_ptr

c++ - 使用 C++ 调用不正常地重新启动 Mac OS X?

c++ - `recv()` 会导致缓冲区溢出吗?

C# 在主线程关联中执行 Threading.ThreadPool.QueueUserWorkItem 回调

java - 2个线程按顺序打印数字

可以作为 "double (*)[4]"传递的 c++11 对象

c++ - 负的 dwLowDateTime 在 FILETIME 结构中意味着什么?

c++ - 使用对象中的方法调用带有 std::bind 和 std::function.target 的 C 风格函数地址

java - 这是循环死锁还是循环等待?

c++11 - 为什么 std::thread 没有 try_join_for() 和 interrupt() 方法