首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++ 11中线程的延迟启动

C++ 11中线程的延迟启动
EN

Stack Overflow用户
提问于 2014-08-27 18:29:18
回答 6查看 32.2K关注 0票数 50

我遇到了C++11线程,遇到了一个问题。

我希望将线程变量声明为全局变量,并在稍后启动它。

然而,我所见过的所有示例似乎都是立即启动线程的,例如

代码语言:javascript
复制
thread t(doSomething);

我想要的是

代码语言:javascript
复制
thread t;

并稍后启动该线程。

我试过的是

代码语言:javascript
复制
if(!isThreadRunning)
{
    thread t(readTable);
}

但现在t是块作用域。所以我想声明t,然后稍后启动线程,这样t就可以被其他函数访问了。

谢谢你的帮助。

EN

回答 6

Stack Overflow用户

发布于 2014-08-27 19:02:22

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

代码语言:javascript
复制
std::thread t;

赋值运算符移动线程对象的状态,并将赋值自线程对象设置为其默认初始化状态:

代码语言:javascript
复制
t = std::thread(/* new thread code goes here */);

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

下面是一个例子:

代码语言:javascript
复制
#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;
}
票数 70
EN

Stack Overflow用户

发布于 2014-08-27 18:54:25

我将为线程提供一个条件变量和一个名为startRunning的布尔值(最初设置为false)。实际上,您可以在创建线程时立即启动线程,但是它要做的第一件事就是挂起自己(使用condition_variable),然后仅当condition_variable从外部发出信号(并且startRunning标志设置为true)时才开始处理其实际任务。

编辑:伪代码:

代码语言:javascript
复制
// in your worker thread
{
    lock_guard l( theMutex );

    while ( ! startRunning )
    {
        cond_var.wait( l );
    }
}

// now start processing task


// in your main thread (after creating the worker thread)
{
    lock_guard l( theMutex );
    startRunning = true;
    cond_var.signal_one();
}

编辑#2:在上面的代码中,两个线程都必须可以访问变量theMutexstartRunningcond_var。您是通过使它们成为全局的还是通过将它们封装在结构/类实例中来实现这一点,这取决于您。

票数 2
EN

Stack Overflow用户

发布于 2014-08-27 19:07:32

没有创建线程“挂起”的“标准”,我想这就是您想要使用C++线程库做的事情。因为并不是每个有线程的平台都支持它,所以C++应用编程接口中也没有它。

  1. 你可能想创建一个包含所有必需数据的类,而不是实际运行你的线程函数。这与创建线程不同,但可能是您想要的。
  2. 你可能需要你的线程的线程id。这意味着您确实需要启动线程函数。但是,它可以从等待条件变量开始。然后,当您希望该条件变量继续运行时,您可以向该条件变量发送信号或进行广播。当然,你可以让函数在它恢复后检查一个条件,以防你可能已经决定关闭它并不运行它(在这种情况下,它只会返回instantly).
  3. You可能需要一个没有函数的std::thread对象)。您可以这样做,并在以后将其附加到一个函数,以便在新线程中run该函数。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25524775

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档