问题标签 [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++ - std::this_thread::yield 只是一个提示会有问题吗?
我和同事讨论了一个假设的问题,当一个人想要用 实现自旋锁互斥锁std::atomic_flag
,但也不是将自旋锁实现为 while(true) 而是作为
基本上的想法是,即使它具有实时优先级,线程也不能“在很长时间内”阻塞其他线程,因为它会在一段时间后产生......但是当我看到 std::yield 的规范时,我很惊讶它是一个建议,不是强制性的。
为实现提供提示以重新安排线程的执行,从而允许其他线程运行。
http://en.cppreference.com/w/cpp/thread/yield
那会不会有问题?
c++ - 如何让 this_thread::sleep_for(a while)?
尝试编写一个简单的计时器和一些代码来测试它,让程序休眠一段时间:
这给了我一个编译器错误:
我以前没用过<thread>
图书馆。你能建议一个快速修复吗?我也很高兴有一个替代方法来测试计时器的正确性。
c++ - std::thread 构造函数中的可移动参数 (Visual C++ 2012)
我在 MSVC 2012 中遇到了右值引用的问题。
编译器说:错误 C2664: 'void (std::promise<_Ty> &&)' : 无法将参数 1 从 'std::promise<_Ty>' 转换为 'std::promise<_Ty> &&'
是否有我的错误(然后如何解决它)或编译器问题(然后我想知道这种行为的起源)?
c++ - 线程化opencl编译
[更新:] 我现在正在生成多个进程并且它工作得相当好,尽管基本的线程问题仍然存在。[/]
我正在尝试编写一个编译一堆 opencl 内核的 c++ (g++ 4.6.1) 程序。大部分时间都花在 clBuildProgram 中。(这是基因编程,实际上运行代码和评估适应性要快得多。)我正在尝试线程化这些内核的编译,但到目前为止没有任何运气。此时,线程之间没有共享数据(除了具有相同的平台和设备引用),但它一次只能运行一个线程。我可以将此代码作为多个进程运行(只是在 linux 的不同终端窗口中启动它们),然后它将用完多个内核,但不在一个进程中。我可以使用具有相同基本线程代码(std::thread)的多个内核,只需要基本数学,所以我认为它' 与 opencl 编译或我忘记的一些静态数据有关。:) 有任何想法吗?我已经尽力使这个线程安全,所以我很难过。
我正在使用 AMD 的 SDK(opencl 1.1,大约 2010 年 6 月 13 日)和 5830 或 5850 来运行它。SDK 和 g++ 不是最新的。上次我为了获得更新的 g++ 安装了更新的 linux 发行版时,我的代码以一半的速度运行(至少 opencl 编译是),所以我回去了。(刚刚检查了该安装上的代码,它以一半的速度运行,仍然没有线程差异。)另外,当我说它一次只运行一个线程时,它会启动所有线程,然后在两个线程之间交替,直到它们完成,然后做接下来的两个,等等。看起来所有线程都在运行,直到代码开始构建程序。我没有在 clBuildProgram 中使用回调函数。我意识到这里有很多可能出错的地方,没有代码很难说。:)
我很确定这个问题发生在 clBuildProgram 内部或调用中。我正在打印这里花费的时间,被推迟的线程将在第一次编译时返回很长的编译时间。这些 clBuildProgram 调用之间唯一共享的数据是设备 ID,因为每个线程的 cl_device_id 具有相同的值。
这就是我启动线程的方式:
这是它陷入困境的地方(这些都是被传递的局部变量,尽管设备 ID 将是相同的):
每个线程是否具有唯一的上下文或命令队列似乎没有区别。我真的怀疑这是我提到它的原因。:)
更新:使用 fork() 生成子进程将适用于此。
c++ - 如果在并行部分执行会引发错误?
在我的代码中,我有一个使用静态随机引擎生成器运行的函数,如果用户尝试从与主线程不同的线程调用此函数,我希望能够抛出错误。
例如,如果您考虑以下功能:
会是/* SOMETHING */
什么?
c++ - 什么可能导致线程 id 为 -1?
根据Herb Sutter 的介绍,我目前一直在玩并发对象。我目前正在使用带有 11 月 CTP 的 Visual Studio 2012(无法以另一种方式检查下面的内容,Clang 不喜欢 decltypes 中的类成员,g++ 不喜欢 Windows 上的任何东西)。
这样做,我遇到了一个奇怪的错误,线程 ID 为 -1。考虑以下代码:
这只是std::thread
带有 lambda 函数的 a 的初始化——我想,没什么了不起的。但是如果没有第一行强制调用 std::cerr (没有优化),这个线程的 id 似乎是 -1 (由于调试器),否则,它应该是。
执行时出现此线程ID的问题
在message-queue内部,因为它在较低的 API (mutex.c) 中的某个地方崩溃。
有没有人知道可能导致这种奇怪行为的原因?目前添加调用std::cerr
只是一个讨厌的解决方法,我想摆脱它......
如果您想使用它,可以在Github上找到完整的源代码。
c++ - C++11 线程,在主线程上运行
我正在做一些尝试 C++11 线程的开发。我想在异步线程中运行一些代码,当该代码完成后,我想在主线程上运行其他代码但只有当它完成时!
这是因为我想异步运行的事情是加载 OpenGL 的东西,并且在执行线程时使用 OpenGL 上下文有点棘手,据我所知,这几乎不是在不同的线程中运行相同的上下文。
但是我想创建一个加载器线程,它加载 collada 文件,这里真正耗时的东西是解析文件并设置数据,所有我可以(技术上)在一个单独的线程中做的事情,然后只是做主线程上的 opengl 特定任务。(这是我最初的想法,我可能只是走错路了)..
所以我在想,如果我可以分离一个异步线程来加载 collada 文件并填写数据,那么一旦完成,我将在主线程上调用以绑定缓冲区、设置着色器等等。我可以在没有线程的情况下做到这一点,但是在后台加载新数据时会非常顺利,而不会让 GL 吓坏..
所以我会尝试排列我想要做的步骤:
- 主线程到处做它做的事情......
- 有人要求加载新的网格
- 通过创建异步线程并在其中加载 collada 数据来初始化网格
- 同时主线程继续做它的东西
- 一旦collada加载完成,异步线程通知主线程它希望在主线程上进行额外的加载(即设置缓冲区等)。
- 设置完成,网格将自身添加到渲染队列
我确实让所有这些都同步工作,我想要的是一种在分离的异步线程完成后做一些事情的方法。
任何想法或对我的想法的建设性批评:P 都受到热烈欢迎!我可能在想这一切都是错误的方式,我一直在考虑做一些类似观察者模式的事情,但我真的不知道如何以最好的方式解决它。我不介意线程化OpenGL的东西,但这似乎有点像自找麻烦..
c++ - Executing a member function of a class
I am trying to experiment the C++11 threads in a way that it accepts a member function of a class as a parameter into the thread constructor as shown in the first code snippet below on line 20 that is marked . The class definition is given in the 2nd code snippet. When this code is compiled, I am getting a bunch of errors shown in the 3rd snippet. Can anyone tell me what I am doing wrong? Thanks.
SNIPPET 1: Thread initialization (main_app.cpp)
SNIPPET 2: Class definition
SNIPPET 3: Compilation output
c++ - 后续:执行一个类的成员函数
这是我之前在Executing a member function of a class 中发布的问题的后续。
我正在尝试以某种方式试验 C++1.1 线程,即它接受一个类的成员函数作为线程构造函数的参数,如下面第 20 行标记的第一个代码片段所示。类定义在第二个代码片段中给出。根据之前相关帖子中给出的答案,代码现在可以很好地编译。但是,现在我在第一个片段的第 20 行遇到了运行时错误。GDB 回溯显示在第三个片段中。我是 C++ 新手,无法正确解释此错误。你能告诉我有什么问题吗?谢谢。
片段 1:线程初始化(main_app.cpp)
片段 2:类定义
片段 3:GDB 回溯
c++ - 使用 clr 和 std::thread
我正在为桌面创建一个 UI 抽象层。现在我正在实现 .NET 框架的功能。烦人的事情是,如果我让用户在 Visual Studio 中创建 CLR Windows 窗体应用程序,他们将无法使用所有标准库std::thread
,如果我让他们创建另一种类型的应用程序,控制台就会出现。
有没有办法将clr与std::thread
CLR 控制台或 CLR 空项目一起使用,或者更好的是,有没有办法阻止控制台启动(或从屏幕和任务栏隐藏它)。
谢谢