问题标签 [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++ - 标准 C++ 线程 ID - 奇怪的行为
我需要按需创建一些线程,因为我之前不知道我需要多少。std::vector<std::thread> threads;
为了在每次创建新线程时使用向量“存储”线程,我将它们推回到向量上:threads.push_back(std::thread(worker));
要存储(用于测试)线程 id,我使用以下内容:double test = std::hash<std::thread::id>()(std::this_thread::get_id());
根据 cpp-references hash、thread::id和get_id这应该可以正常工作。
但只有这一行我得到的 id 总是 0(零)
如果 id 在哈希线下方添加以下行,它可以工作,我从线程中得到一个哈希 id:std::thread::id tid = std::this_thread::get_id();
即使我不使用tid
有人可以解释这种行为吗?我正在使用eclipse juno并多次清理+重建项目......我只是不明白:/
这里的代码:(逐行,因为这里的格式规则很愚蠢-.-
c++ - C++11 condition_variable 同步问题
我有一个简单的线程池,它需要能够等待其工作人员在不使用标准的情况下消耗队列中的所有任务thread::join()
,因为我不想自己杀死线程,而只是等待它们完成所有任务同时停留在他们的执行循环中。我想用condition_variable
s 来完成这个,像这样:
线程池.cpp
Thread.cpp 请注意,这是 ThreadPool 的友元类
我正在使用这个东西进行物理模拟,并且这些东西发生在所述模拟的每一步(大约每 16 毫秒一次)。发生的情况是,在几百步之后,一切都停止了,因为在主线程进入等待状态之前以某种方式发送了一个通知信号,可能是因为它正在检查条件。如果我调试,我可以看到我在计数器上剩下一个任务,线程上没有任务运行,队列中没有任务,并且什么都没有发生。有时,更奇怪的是,只要我用断点暂停执行并重新启动它,一切都会解锁。我试过把更多的锁放在适当的位置,但无济于事。我有什么明显的遗漏吗?
更新似乎通过将assignedTasks
变量设置为来解决问题volatile
。它经常被修改,以至于有时寄存器中的值没有更新,一切都停止了。以前从来没有这样做过。嗯。:)
c++ - 2个线程比1个慢?
我在玩,std::thread
突然出现了一些奇怪的东西:
当使用 clang++ 编译上述代码时,我得到了以下基准:
然后我将代码更改为以下内容:(现在仅使用 1 个线程)
这些是新的基准:
为什么使用 2 个线程的代码比使用 1 个线程的代码慢?
c++ - 使用 std::thread (C++ 11) 多线程无法正常工作
我编写了一个小型 c++ 程序,试图了解多线程如何使用std::thread
. 这是我的程序执行的步骤:
- 初始化具有唯一值“42”的 5x5 整数矩阵,包含在类“Toto”中(在主中初始化)。
- 我打印初始化的 5x5 矩阵。
- 声明
std::vector
5 个线程。 - 我将所有线程分别附加到它们的任务(
threadTask
方法)中。每个线程将操作一个std::vector<int>
实例。 - 我加入所有线程。
- 我打印我的 5x5 矩阵的新状态。
这是输出:
它应该是 :
这是代码示例:
但是,在方法threadTask
中,如果我打印变量list[x]
,输出是正确的。我认为我无法在主线程中打印正确的数据,因为 printData() 调用在主线程中,并且threadTask
函数中的显示是正确的,因为该方法是在自己的线程中执行的(不是主线程)。奇怪,就是说在一个父进程中创建的所有线程都不能修改这个父进程中的数据?我想我忘记了代码中的某些内容。我真的迷路了。有人可以帮助我吗?非常感谢您的帮助。
c++ - 是否可以使用 std::thread 在英特尔至强融核上进行并行化?
我知道英特尔至强融核并行化的经典示例是使用OpenMP
. 但是是否可以std::thread
在 Xeon Phi 上使用自动启动任务?
c++11 - 在 VS2012 中通过引用传递 std::thread c++0x
我期待线程创建(workers.push_back(thread(&ThreadFn, x));
)中出现编译错误,因为x
应该由 ref 传递。我虽然正确的语法应该是:
当然,代码编译得很好,也表现得很好。我正在使用VC11
. 知道为什么这没有被标记吗?
c++ - c++11中的线程池和执行队列
我有一堆并行任务要完成,但只有几个工作线程(比如 8 个,但我希望这是可配置的)。
因此,8 个线程运行,每个线程从队列中弹出下一个任务,只要队列有任务。
C++11 是否提供任何内置结构来帮助实现此设计?
我看到一些类似的讨论std::async
,但我认为它给编译器的实现留下了太多东西。
c++11 - 为什么 std::thread 的参数转换是在创建的线程中执行的,而不是父线程?
我最近了解到 std::thread 的这种不幸行为
(这里的问题是缓冲区到期和从 char* 到 std::string 的转换是在调用线程中完成的)解决方案是创建这样的线程:
但我的问题是 ISO 选择这种行为的原因是什么(尽管当你想到它仍然是许多错误的潜在来源时,这是完全合乎逻辑的......)。
c++11 - 控制台输出顺序减慢多线程程序
编译以下代码时
在 MinGW 4.8.1 下,在我的盒子上执行大约需要 2.5 秒。这大约是仅task
单线程执行函数所需的时间。
但是,当我取消注释中间的行并因此注释掉之前的行时(即,当我交换d
和"(Help)"
写入的顺序时std::cout
)整个事情现在需要 8-9 秒。
解释是什么?
我再次测试,发现我只有 MinGW-build 的问题,x32-4.8.1-win32-dwarf-rev3
但没有 MinGW build的问题x64-4.8.1-posix-seh-rev3
。我有一台 64 位的机器。使用 64 位编译器,两个版本都需要三秒钟。但是,使用 32 位编译器,问题仍然存在(并且不是由于发布/调试版本混淆)。
qt-creator - 使用 std::thread 时出现奇怪的 Qt Creator 行为
在玩 C++ 11std::thread
时,我发现了以下奇怪的应用程序行为(使用 Qt Creator 2.7.2):
文件 main.cpp:
。轮廓:
在“禁用终端运行”的情况下运行它时,产生的输出是:
富:4 5 9
富:4 5 18
富:4 5 27
(预期的)
或者:
富:4 5 9
富:4 5 18
(错误,缺少一个 run() 调用)
由于这个应用程序还不是真正的多线程(只有一个子线程始终在运行),它看起来不像是竞争条件。知道附加代码有什么问题吗?