问题标签 [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.
c++ - 指针和引用作为线程参数的区别
这是一个例子:
输出是:
使用 gcc 4.5.2 编译,带有和不带有-O2
标志。
这是预期的行为吗?
这个程序数据竞赛是免费的吗?
谢谢
c++ - 如何检查 std::thread 是否仍在运行?
如何检查 astd::thread
是否仍在运行(以独立于平台的方式)?它缺乏一种timed_join()
方法,joinable()
并不意味着这样做。
我想过在线程中用 a 锁定一个互斥锁,std::lock_guard
并使用try_lock()
互斥锁的方法来确定它是否仍然被锁定(线程正在运行),但这对我来说似乎不必要地复杂。
你知道更优雅的方法吗?
更新:要明确:我想检查线程是否干净退出。为此目的,“挂起”线程被视为正在运行。
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 调用?
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 提交错误?
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()”指令之后直接执行“等待”指令。有人知道用标准库创建如此关键的指令序列的方法吗?
提前致谢。
c++ - 这段代码安全吗,可以从构造函数 C++ 生成线程吗?
我需要在 C++ 类中嵌入一个线程,这是一种活动对象,但不完全是。我正在从类的构造函数中生成线程,这样做可以吗?这种方法有什么问题吗?
c++ - 在 C++ 中的线程内启动和停止循环
我需要从一个事件开始一个循环,然后从另一个事件中停止它。我的想法是当我按下按钮时调用函数 startDequeuing(),以便启动具有循环的线程,然后终止该循环,将函数 stopDequeuing() 中的“出队”变量设置为 false。
这是我第一次使用线程,当我启动循环时程序会锁定,我认为是因为变量“出队”被锁定并且无法从线程外部访问,对吗?
我怎么解决这个问题??
这里有一些代码:
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])
我在网上搜索,但没有找到合适的。
c++ - 使用 C++0x std::thread 在新对象中调用成员函数
我想做这样的事情:
但它不会编译。我试图查看http://accu.org/index.php/journals/1584但它没有提到成员函数位于新对象中的情况。什么是正确的语法?
c++ - std::promise 和 std::future 的非显而易见的生命周期问题
这个问题与这里的前一个问题非常相似:pthread_once() 中的竞争条件?
它本质上是相同的问题 -std::promise
调用期间结束 的生命周期promise::set_value
(即:在关联的未来被标记之后,但在pthread_once
执行之前)
所以我知道我的用法有这个问题,因此我不能以这种方式使用它。但是,我认为这不是显而易见的。(用 Scott Meyer 的话来说:使接口易于正确使用和难以正确使用)
我在下面提供一个示例:
- 我有一个线程 (
dispatcher
),它在队列上旋转,弹出一个“作业”(astd::function
) 并执行它。 - 我有一个名为的实用程序类
synchronous_job
,它会阻塞调用线程,直到在调度程序线程上执行了“作业” std::promise
and是的std::future
成员synchronous_job
- 一旦future
设置了,被阻塞的调用线程继续,这导致synchronous_job
从堆栈中弹出并被破坏。- 不幸的是,此时在里面
dispatcher
是上下文切换的;已标记,但调用尚未执行,并且 pthread 堆栈以某种方式损坏,这意味着下一次:死锁promise::set_value
future
pthread_once
我希望调用promise::set_value
是原子的;以这种方式使用这些类时,它需要在标记后做更多工作的事实future
将不可避免地导致此类问题。
std::promise
所以我的问题是:如何使用and来实现这种同步,并std::future
保持它们的生命周期与提供这种同步机制的类相关联?
@Jonathan Wakely,您是否可以在内部使用一些 RAII 样式的类,condition_variable
在标记future
? 这意味着即使promise
在调用 的过程中破坏了set_value
,设置条件变量的额外工作也将正确完成。只是一个想法,不知道你是否可以使用它......
下面是一个完整的工作示例,以及死锁应用程序的堆栈跟踪:
死锁应用的堆栈跟踪:
线程 1(主线程)
线程 2(调度程序线程)