标签: stdthread

为什么这个程序抛出'std :: system_error'?

可能重复:
为什么这个简单的std :: thread示例不起作用?

码:

#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"在我的语言环境中意为"中止".

c++ c++11 stdthread

4
推荐指数
1
解决办法
1445
查看次数

这是微软实施std :: thread的一个大错误吗?

#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++ memory-leaks visual-c++ c++11 stdthread

4
推荐指数
1
解决办法
2131
查看次数

C++ 11线程,在主线程上运行

我正在尝试尝试C++ 11线程.我想在异步线程中运行一些代码,当代码完成后,我想在主线程上运行其他代码,但只有当它完成时!

这是因为我想要运行async的东西是加载OpenGL的东西,而且在执行线程时使用OpenGL上下文有点棘手,据我所知,它几乎不会在不同的线程中运行相同的上下文.

但是我想创建一个加载器线程,它加载collada文件,这里耗时的东西真的是解析文件并设置数据和我可以(技术上)在一个单独的线程中做的所有这些然后只是做主线程上的opengl特定任务.(这是我最初的想法,我可能只是以错误的方式去做)..

所以我想如果我可以分离一个线程异步来加载collada文件并填充数据,那么一旦完成,我将调用主线程来绑定缓冲区,设置着色器等等.我可以在没有线程的情况下完成它,但是在没有GL吓坏的情况下在后台加载新数据会非常顺利.

所以我会尝试排列我想要做的步骤:

  1. 主线程绕着做它做的事情......
  2. 有人要求加载新网格
  3. 通过创建异步线程并在其中加载collada数据来初始化网格
  4. 同时主线程继续做它的东西
  5. 一旦collada加载完成,异步线程就会通知主线程它希望在主线程上进行额外的加载(即设置缓冲区等).
  6. 设置完成,网格将自身添加到渲染队列

我确实所有它都是同步工作的,我想要的是一旦分离的异步线程完成后做一些事情的方法.

任何想法或当然是对我思想的建设性批评:P受到热烈欢迎!我可能会以错误的方式思考它,我一直在考虑做一些像观察者模式的事情,但我真的不知道如何以最好的方式解决它.我不介意线程化OpenGL的东西,但它似乎有点像要求麻烦..

c++ opengl asynchronous c++11 stdthread

4
推荐指数
1
解决办法
2355
查看次数

等待 std::thread 完成

我试图在程序终止时优雅地清理,所以我正在调用join()astd::thread等待它完成。这似乎只是永远阻塞了主线程,但我不明白为什么,因为工作线程是一个(几乎)空循环,如下所示:

void GameLoop::Run()
{
    while (run)
    {
        //  Do stuff... 
    }   
    std::cout << "Ending thread...\n";
}
Run Code Online (Sandbox Code Playgroud)

当然,我runjoining之前设置为 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()

c++ multithreading c++11 stdthread

4
推荐指数
1
解决办法
1万
查看次数

使用make_shared <std :: thread>创建shared_ptr <std :: 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.但是,编译器给出了错误" 类型的引用的无效初始化...从类型'未解析的重载函数类型'的表达式 ".显然我做了一些愚蠢的事,但我不能把手指放在上面.有人可以帮忙吗?提前致谢!

c++ multithreading shared-ptr c++11 stdthread

4
推荐指数
1
解决办法
3585
查看次数

删除std :: thread指针会引发异常"libc ++ abi.dylib:terminate"

在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++ multithreading c++11 stdthread

4
推荐指数
1
解决办法
4511
查看次数

C++11 thread::id 表示无线程的特殊值

手册页指出

此类的实例还可能包含不代表任何线程的特殊不同值。

但是我找不到这个特殊值是什么或者它在哪里定义(在<线程>中查看)。有任何想法吗?

c++ multithreading c++11 stdthread

4
推荐指数
1
解决办法
104
查看次数

为什么C++线程可移动但不可复制?

正如问题标题所说,为什么C++线程(std::threadpthread)是可移动的但不可复制?如果我们确实使其可复制,会产生什么后果?

c++ multithreading pthreads stdthread

4
推荐指数
1
解决办法
2716
查看次数

没有参数的std :: thread构造函数

根据cppreference.com,std::thread没有参数的 构造函数意味着:

创建不代表线程的新线程对象.

我的问题是:

  1. 为什么我们需要这个构造函数?如果我们创建一个thread使用这个构造函数,我们如何在以后"分配"一个线程函数?
  2. 为什么我们没有"run(function_address)"方法,这样当没有参数构造时,我们可以指定一个"运行"的函数thread.
  3. 或者,我们可以构造一个thread带有可调用参数(函数,函子等)但是调用"run()"方法以便稍后实际执行该线程.为什么std::thread不以这种方式设计?

c++ multithreading c++11 stdthread

4
推荐指数
1
解决办法
3512
查看次数

线程在 C++ 中完成后将新任务分配给线程

我在 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++ concurrency multithreading stdthread

4
推荐指数
2
解决办法
5007
查看次数