问题标签 [stdthread]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
27401 浏览

c++ - 指针和引用作为线程参数的区别

这是一个例子:

输出是:

使用 gcc 4.5.2 编译,带有和不带有-O2标志。

这是预期的行为吗?

这个程序数据竞赛是免费的吗?

谢谢

0 投票
7 回答
129527 浏览

c++ - 如何检查 std::thread 是否仍在运行?

如何检查 astd::thread是否仍在运行(以独立于平台的方式)?它缺乏一种timed_join()方法,joinable()并不意味着这样做。

我想过在线程中用 a 锁定一个互斥锁,std::lock_guard并使用try_lock()互斥锁的方法来确定它是否仍然被锁定(线程正在运行),但这对我来说似乎不必要地复杂。

你知道更优雅的方法吗?

更新:要明确:我想检查线程是否干净退出。为此目的,“挂起”线程被视为正在运行。

0 投票
5 回答
2296 浏览

c++ - linux上的学习线程

Linux 对我来说是一个新平台。我已经用 C++ 在 Windows 上编码多年,并且已经习惯了该平台上的多线程。

当我需要在 linux 平台上学习 c++ 时,C++11 出现了。

Linux 似乎在大多数情况下使用 pthreads - 好吧还有 boost::threads 和 QT 也有自己的线程。但是随着 C++11 的出现,std::thread 是一种全新的(跨平台和 C++ 标准)处理线程的方法。

所以我想我必须学习 pthreads 和 std::threads。最终,std::thread 似乎更重要,但是那里有很多遗留代码,所以我必须知道两者。

对于 Windows 上的线程同步,我会使用WaitForMultipleObjects来等待一些任务完成,然后再继续进一步的工作。

pthread 是否存在类似的同步机制?标准::线程?

我看过pthread_join,它似乎可以一次只等待一个线程。我是否错过了另一个 pthread 调用?

0 投票
5 回答
12414 浏览

c++ - 使用 VS2012 RC 时,如果在 main() 退出后调用 std::thread::join() 将挂起

如果在 Ubuntu 12.04 上使用 Clang 3.2 或 GCC 4.7 编译,则以下示例运行成功(即不会挂起),但如果我使用 VS11 Beta 或 VS2012 RC 编译则挂起。

问题似乎是,如果在退出std::thread::join()后调用它,则永远不会返回。main它在 cthread.cWaitForSingleObject中定义的地方被阻塞。_Thrd_join

SleepFor(100);在末尾取消注释main可以让程序正确退出,就像制作std_test非静态一样。使用boost::thread也避免了这个问题。

所以我想知道我是否在这里调用未定义的行为(对我来说似乎不太可能),或者我是否应该针对 VS2012 提交错误?

0 投票
1 回答
2346 浏览

c++ - C++ 在调用 std::unique_lock 之前解锁 std::mutex 等待

我有一个带有管理器(树类)的多线程应用程序(使用 std::thread),它在不同的子树(嵌入式结构子树)上并行执行一些代码。基本思想是 SubTree 的每个实例都有一个存储对象的双端队列。如果双端队列为空,则线程等待直到在双端队列中插入新元素或达到终止条件。一个子树可以生成对象并将它们推送到另一个子树的双端队列中。为方便起见,我所有的 std::mutex、std::locks 和 std::variable_condition 都存储在一个名为“locks”的结构中。

Tree 类创建了一些运行以下方法的线程(第一次尝试):

问题是“deque_lock”在线程等待时仍然被锁定。因此,并发对象不能在当前线程的双端队列中添加任何对象。

所以我把 lock_guard 变成了一个 unique_lock 并手动管理锁定/解锁:

现在的问题是存在数据竞争,我想确保在“deque_lock.unlock()”指令之后直接执行“等待”指令。有人知道用标准库创建如此关键的指令序列的方法吗?

提前致谢。

0 投票
3 回答
673 浏览

c++ - 这段代码安全吗,可以从构造函数 C++ 生成线程吗?

我需要在 C++ 类中嵌入一个线程,这是一种活动对象,但不完全是。我正在从类的构造函数中生成线程,这样做可以吗?这种方法有什么问题吗?

0 投票
3 回答
5390 浏览

c++ - 在 C++ 中的线程内启动和停止循环

我需要从一个事件开始一个循环,然后从另一个事件中停止它。我的想法是当我按下按钮时调用函数 startDequeuing(),以便启动具有循环的线程,然后终止该循环,将函数 stopDequeuing() 中的“出队”变量设置为 false。

这是我第一次使用线程,当我启动循环时程序会锁定,我认为是因为变量“出队”被锁定并且无法从线程外部访问,对吗?

我怎么解决这个问题??

这里有一些代码:

0 投票
2 回答
2560 浏览

c++ - debian 和 std::thread c++ 的即时分段错误

有这个问题 - 在标题..

我有这个代码:

取自网络某处。编译器选项-pthread -std=gnu++0x(也试过-std=c++0x),我有段错误。一切都在 vmBox 上的 Debian 上。我之前已经启动了其他代码,并且它们有效。突然,我在所有工作应用程序中使用 std::thread 的线程出现了段错误。

编辑:这是来自 gdb:

(当我使用 std::thread t(&ClassName::my_thread_func,ptr) 启动更高级的应用程序时,错误是相同的,但其他行 [thread:133])

我在网上搜索,但没有找到合适的。

0 投票
2 回答
113 浏览

c++ - 使用 C++0x std::thread 在新对象中调用成员函数

我想做这样的事情:

但它不会编译。我试图查看http://accu.org/index.php/journals/1584但它没有提到成员函数位于新对象中的情况。什么是正确的语法?

0 投票
4 回答
10777 浏览

c++ - std::promise 和 std::future 的非显而易见的生命周期问题

这个问题与这里的前一个问题非常相似:pthread_once() 中的竞争条件?

它本质上是相同的问题 -std::promise调用期间结束 的生命周期promise::set_value(即:在关联的未来被标记之后,但在pthread_once执行之前)

所以我知道我的用法有这个问题,因此我不能以这种方式使用它。但是,我认为这不是显而易见的。(用 Scott Meyer 的话来说:使接口易于正确使用和难以正确使用

我在下面提供一个示例:

  • 我有一个线程 ( dispatcher),它在队列上旋转,弹出一个“作业”(a std::function) 并执行它。
  • 我有一个名为的实用程序类synchronous_job,它会阻塞调用线程,直到在调度程序线程上执行了“作业”
  • std::promiseand是的std::future成员synchronous_job- 一旦future设置了,被阻塞的调用线程继续,这导致synchronous_job从堆栈中弹出并被破坏。
  • 不幸的是,此时在里面dispatcher是上下文切换的;已标记,但调用尚未执行,并且 pthread 堆栈以某种方式损坏,这意味着下一次:死锁 promise::set_valuefuturepthread_once

我希望调用promise::set_value是原子的;以这种方式使用这些类时,它需要在标记后做更多工作的事实future将不可避免地导致此类问题。

std::promise所以我的问题是:如何使用and来实现这种同步,并std::future保持它们的生命周期与提供这种同步机制的类相关联?

@Jonathan Wakely,您是否可以在内部使用一些 RAII 样式的类,condition_variable在标记future? 这意味着即使promise在调用 的过程中破坏了set_value,设置条件变量的额外工作也将正确完成。只是一个想法,不知道你是否可以使用它......

下面是一个完整的工作示例,以及死锁应用程序的堆栈跟踪:

死锁应用的堆栈跟踪:

线程 1(主线程)

线程 2(调度程序线程)