码:
#include <iostream>
#include <thread>
void f()
{
std::cout << "hi thread" << std::endl;
}
int main()
{
std::thread t(f);
std::cout << "hi" << std::endl;
t.join();
}
Run Code Online (Sandbox Code Playgroud)
问题:
$ g++ -o thread_test thread_test.cpp -std=c++0x
$ ./thread_test
terminate called after throwing an instance of 'std::system_error'
what(): Operation not permitted
Abortado
Run Code Online (Sandbox Code Playgroud)
"Abortado"在我的语言环境中意为"中止".
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#include <thread>
using namespace std;
void Hello()
{}
int main()
{
{
std::thread(Hello).join();
}
_CrtDumpMemoryLeaks();
}
Run Code Online (Sandbox Code Playgroud)
输出窗口显示:(VC++编译器版本:2012年11月CTP)
The thread 0x5ab8 has exited with code 0 (0x0).
Detected memory leaks!
Dumping objects ->
{261} normal block at 0x002A2E00, 44 bytes long.
Data: < > 01 00 00 00 00 00 00 00 00 00 00 00 0A 00 00 00
Object dump complete.
The thread 0x5abc has exited with code 0 (0x0).
The thread 0x5ab4 …Run Code Online (Sandbox Code Playgroud) 我正在尝试尝试C++ 11线程.我想在异步线程中运行一些代码,当代码完成后,我想在主线程上运行其他代码,但只有当它完成时!
这是因为我想要运行async的东西是加载OpenGL的东西,而且在执行线程时使用OpenGL上下文有点棘手,据我所知,它几乎不会在不同的线程中运行相同的上下文.
但是我想创建一个加载器线程,它加载collada文件,这里耗时的东西真的是解析文件并设置数据和我可以(技术上)在一个单独的线程中做的所有这些然后只是做主线程上的opengl特定任务.(这是我最初的想法,我可能只是以错误的方式去做)..
所以我想如果我可以分离一个线程异步来加载collada文件并填充数据,那么一旦完成,我将调用主线程来绑定缓冲区,设置着色器等等.我可以在没有线程的情况下完成它,但是在没有GL吓坏的情况下在后台加载新数据会非常顺利.
所以我会尝试排列我想要做的步骤:
我确实所有它都是同步工作的,我想要的是一旦分离的异步线程完成后做一些事情的方法.
任何想法或当然是对我思想的建设性批评:P受到热烈欢迎!我可能会以错误的方式思考它,我一直在考虑做一些像观察者模式的事情,但我真的不知道如何以最好的方式解决它.我不介意线程化OpenGL的东西,但它似乎有点像要求麻烦..
我试图在程序终止时优雅地清理,所以我正在调用join()astd::thread等待它完成。这似乎只是永远阻塞了主线程,但我不明白为什么,因为工作线程是一个(几乎)空循环,如下所示:
void GameLoop::Run()
{
while (run)
{
// Do stuff...
}
std::cout << "Ending thread...\n";
}
Run Code Online (Sandbox Code Playgroud)
当然,我run在joining之前设置为 false 。现在,我怀疑它与它是一个成员函数并在 object destroy 时被调用有关。我正在创建这样的线程:runThread.reset(new thread(&GameLoop::Run, this));, where runThreadisunique_ptr<std::thread>和GameLoop. 该join()电话打进来的的析构函数GameLoop对象。
如果它的对象正在被销毁,循环线程可能无法完成?根据调试器的说法,循环线程在msvcr120d.dll. 如果是这样,你会如何处理?
当心:新来的std::thread!
更新:这是我加入析构函数的呼吁:
run = false;
if (runThread->joinable())
{
runThread->join();
}
Run Code Online (Sandbox Code Playgroud)
更新2:如果我删除join()我得到引发异常~thread()!
请考虑以下代码:
class A
{
....
shared_ptr<std::thread> mThread;
void Step();
void LaunchTrhead();
}
void A::LaunchThread()
{
...
mThread=make_shared<std::thread>(Step); // This line gives an error
...
}
void A::Step()
{
...
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试初始化共享指针mThread,以便它调用函数Step.但是,编译器给出了错误" 类型的引用的无效初始化...从类型'未解析的重载函数类型'的表达式 ".显然我做了一些愚蠢的事,但我不能把手指放在上面.有人可以帮忙吗?提前致谢!
在Mac OS X上使用LLVM 6.0的C++ 11中,我首先创建了一个指向std :: thread内存分配的指针.
std::thread* th = new std::thread([&] (int tid) {
// do nothing.
}, 0);
Run Code Online (Sandbox Code Playgroud)
然后我试着删除它.
delete th;
Run Code Online (Sandbox Code Playgroud)
但是,编译上面的代码并执行它会引发异常
libc++abi.dylib: terminating
Abort trap: 6
Run Code Online (Sandbox Code Playgroud) 正如问题标题所说,为什么C++线程(std::thread和pthread)是可移动的但不可复制?如果我们确实使其可复制,会产生什么后果?
根据cppreference.com,std::thread没有参数的
构造函数意味着:
创建不代表线程的新线程对象.
我的问题是:
thread使用这个构造函数,我们如何在以后"分配"一个线程函数?thread.thread带有可调用参数(函数,函子等)但是调用"run()"方法以便稍后实际执行该线程.为什么std::thread不以这种方式设计?我在 C++ 中有以下代码。代码来自C++ Concurrency In Action: Practical Multithreading
void do_work(unsigned id);
void f() {
std::vector<std::thread> threads;
for(unsigned i = 0; i < 20; ++i) {
threads.push_back(std::thread(do_work, i));
}
std::for_each(threads.begin(), threads.end(), std::mem_fn(&std::thread::join));
}
Run Code Online (Sandbox Code Playgroud)
假设threads[0]已经完成处理并返回一个值。我还有更多文件要处理,现在想将此新文件分配给一个已完成的线程。如何在 C++ 中实现这种行为?或者我必须销毁线程,然后在线程完成后创建一个新线程?但是,我如何检查这些线程中的任何一个是否已完成?
c++ ×10
stdthread ×10
c++11 ×8
asynchronous ×1
concurrency ×1
memory-leaks ×1
opengl ×1
pthreads ×1
shared-ptr ×1
visual-c++ ×1