问题标签 [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::threads 的向量
C++11
我正在尝试制作一个vector
of std::thread
s。结合以下三点说我可以。
1.) 根据http://en.cppreference.com/w/cpp/thread/thread/thread,
thread
的默认构造函数创建一个
不代表线程的线程对象。
2. )根据http://en.cppreference.com/w/cpp/thread/thread/operator%3D,thread
operator=
使用移动语义将 [参数,它是线程右值引用] 的状态分配给 [调用线程]。
3.) 根据 http://en.cppreference.com/w/cpp/container/vector/vector,仅将大小类型变量传递给向量构造函数将构造
具有 T 的 [指定数量] 值初始化(默认构造,用于类)实例的容器。不制作副本。
所以,我这样做了:
这在 VC11 和g++ 4.8.0(此处为在线编译器)中按预期运行,如下所示:
控制台输出:
然后我在clang 3.2中尝试了它,通过在同一网页上切换编译器菜单,它给出:
join()
当代表线程的线程对象在被ed 或ed之前超出范围时detach()
,程序将被强制终止。我已经join()
编辑vecThread.at(0)
了,所以唯一剩下的就是临时线程
std::thread(foo);
在里面
vecThread.at(0) = std::thread(foo);
任务。
但是,根据网络参考,线程只能通过移动线程右值引用来分配。我想不出任何方法join()
或detach()
临时线程对象。
所以如果 clang 的输出是正确的,那么thread
's有什么用operator=
呢?或者这是一个clang编译器错误?
在 g++ 4.8.0 中,换行
vecThread.at(0) = std::thread(foo)
至
vecThread.at(0) = std::thread{foo}
(用大括号替换括号)仍然给出预期的Hello
输出。
但是,将行更改为vecThread.at(0) = {foo}
使其抱怨:
g++ 4.8.0 对大括号的抱怨:
错误:从初始化列表转换为 'std::thread' 将使用显式构造函数 'std::thread::thread(_Callable&&, _Args&& ...) [with _Callable = void (&)(); _Args = {}]' vecThread.at(0) = {foo};
这太高级了——我不知道这是什么意思。
在 clang 中进行相同的更改可以提供更高级的功能:
clang 3.2 对大括号的抱怨:
我也不知道那是什么意思。
我无法使用 VC11 来证实上述内容
vecThread.at(0) = {foo}
问题是因为 VC11,截至 2012 年 11 月的 CTP 编译器,不支持标准库上的统一初始化语法。
c++ - MinGW 和 std::thread
所以我一直在尝试使用 MinGW 编译器让以下代码在 Windows 上编译和运行。
我正在使用以下命令进行编译:
现在的问题是应该使用的 MinGW 版本,我已经尝试了所有我知道的版本。
- MinGW 构建:thread-win32
- MinGW 构建:thread-posix
- MinGW-w64:stdthread 实验性 rubenvb
- MinGW-w64:标准线程实验 rubenvb 4.7
数字 1 不起作用,因为 GCC显然只在内部支持 pthread 的东西。
编号 2 确实编译并且它基本上甚至输出test
(参见输出的最后一行),但它也因错误而崩溃:
3 号和 4 号再次编译,但它们不输出test
,而是立即崩溃,但输出更具描述性:
谷歌当然把我带到了GCC bug tracker和其他一些建议使用的帖子,-pthread
这根本没有帮助。
我也尝试过手动链接winpthread
and pthread
,但这也无济于事。
-std=c++11
和之间也没有区别-std=gnu++11
...
我现在真的很迷茫,不知道是否有可能获得支持 的 MinGW 版本,std::thread
但也许我只是忽略了一些编译器标志。我希望有人可以帮助我!
c++ - C++11 中的线程池
相关问题:
关于 C++11:
关于升压:
如何获得一个线程池以将任务发送到,而无需一遍又一遍地创建和删除它们?这意味着持久线程无需加入即可重新同步。
我的代码如下所示:
与其在每次迭代中创建和加入线程,我更愿意在每次迭代时将任务发送到我的工作线程并且只创建一次。
c++ - SDL_Flip 死锁
在我的应用程序中,我有一个运行应用程序的简单 Execute 方法,大大简化了,它看起来像这样:
Render() 看起来像这样,再次简化:
现在,当附加调试器时这工作正常,但是当我只运行可执行文件时,应用程序冻结,将 gdb 附加到进程,我可以告诉主线程卡在 SDL_Flip() 中。
我已经设法将这个问题缩小到我启动一个单独的线程来监听使用套接字的客户端,因为注释掉第二个线程的开始,使它在所有模式下工作!
线程在“服务器”类中像这样启动:
ListenThread 执行通常的套接字设置 getaddrinfo()、socket()、bind()、listen(),最后调用阻塞函数 accept()。
同样,当附加调试器时,此服务器以及渲染和所有内容都可以完美运行,只有在“直接”启动时它才会挂起(迫使我 KILL 进程停止它)。
Server和App没有共同的数据结构,Server对App一无所知,两者的唯一关系就是App在Server上设置了回调函数。
编辑(附加):这只发生在我的电脑上,我的笔记本电脑上有完全相同的设置(ubuntu、gcc、sdl 版本等),它在我的笔记本电脑上运行良好。请注意它是否/如何相关,但我在 Windows 8 上的 Hyper-V 虚拟机中运行 Ubuntu,如果这有帮助的话。
c++ - std::thread 有多标准?
我注意到,在许多已针对 C++11 更新的经典 C++ 参考源中,例如cplusplus.com和Josuttis 标准库参考书,似乎根本没有涵盖/没有任何文档C++11 并发标准库功能,例如std::thread
、std::atomic
和std::async
.
这些并发特性是否比标准库的其他部分“不那么标准”?还是因为其他原因缺少文档?
c++ - C++11 线程 id,有没有更简单的命名约定?
有一个简单的命名约定可以帮助完成复杂的任务和调试大型程序。
是否有可能有一个更好的命名约定比
例如在线程 id 0x1035a8000 上抛出异常!可能没有多大帮助。每次程序运行时线程 id 都会改变也无济于事。
c++ - C++11 'native_handle' 不是 'std::this_thread' 的成员
在以下代码片段中,
你如何native_handle
从std::this_thread
函数中获取 from foo
?
android - Android NDK 中的 std::thread 错误地卡住了
我们正在构建一个 Java/native 库,该库具有本地网络和视频图像处理(主要使用 c++11 编写)和 Java 开发人员界面。
问题是整个事情在 jni 调用期间经常卡住。我们使用最新的 ndk-r8e 并在本地运行多个线程,使用 std::thread 创建。
欢迎任何想法。
c++ - C++ 11:使用成员函数启动线程,并将 this 作为参数
使用此代码,我得到了错误:
错误 1 错误 C2064:术语不计算为采用 1 个参数的函数 c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional 1152 1 Pipeline
我尝试了很多变化,现在有人如何解决这个问题?
lambda - 线程 lambda 函数无法编译
我很难理解为什么会发生这种情况,也许这是一个错误。
为什么它只有在改变我的评论方式时才会编译?
我正在使用带有 winpthreads 的 gcc 4.8.0。