相关疑难解决方法(0)

在linux下的GCC中使用std :: thread的正确链接选项是什么?

嗨,我正在尝试使用std::threadG ++.这是我的测试代码

#include <thread>
#include <iostream>

int main(int, char **){
    std::thread tt([](){ std::cout<<"Thread!"<<std::endl; });
    tt.join();
}
Run Code Online (Sandbox Code Playgroud)

它编译,但当我尝试运行它时,结果是:

terminate called after throwing an instance of 'std::system_error'
  what():  Operation not permitted 
Aborted
Run Code Online (Sandbox Code Playgroud)

我的编译器版本:

$ g++ --version
g++ (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Run Code Online (Sandbox Code Playgroud)

我的测试代码出了什么问题?

更新:我使用以下命令行来编译和运行我的代码.

$ g++ -std=c++0x test.cpp
$ ./a.out
Run Code Online (Sandbox Code Playgroud)

我试过 …

c++ multithreading g++ c++11

87
推荐指数
3
解决办法
5万
查看次数

用g ++编译多线程代码

我有最简单的代码:

#include <iostream>
#include <thread>

void worker()
{
    std::cout << "another thread";
}

int main()
{
    std::thread t(worker);
    std::cout << "main thread" << std::endl;
    t.join();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

虽然我仍然无法编译它g++来运行.

更多细节:

$ g++ --version
g++ (Ubuntu/Linaro 4.8.1-10ubuntu8) 4.8.1
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Run Code Online (Sandbox Code Playgroud)

编译命令:

$ g++ main.cpp -o main.out -pthread -std=c++11
Run Code Online (Sandbox Code Playgroud)

运行:

$ …
Run Code Online (Sandbox Code Playgroud)

c++ linux ubuntu gcc g++

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

C++ Threads,std :: system_error - 不允许操作?

所以我写了一个程序来测试64位kubuntu linux上的线程,版本13.04.实际上我从正在编写测试程序的其他人那里抢了代码.

#include <cstdlib>
#include <iostream>
#include <thread>

void task1(const std::string msg)
{
    std::cout << "task1 says: " << msg << std::endl;
}

int main(int argc, char **argv)
{
    std::thread t1(task1, "Hello");
    t1.join();

    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

我编译使用:

g++ -pthread -std=c++11 -c main.cpp
g++ main.o -o main.out
Run Code Online (Sandbox Code Playgroud)

然后跑了:

./main.out
Run Code Online (Sandbox Code Playgroud)

顺便说一下,当我使用-l'时,main.out会像所有可执行文件一样以绿色文本显示,但在其名称的末尾也有一个星号.为什么是这样?

回到手头的问题:当我运行main.out时,出现了一个错误,其中说:

terminate called after throwing an instance of 'std::system_error'
  what():  Operation not permitted
Aborted (core dumped)
Run Code Online (Sandbox Code Playgroud)

任何有关如何解决此问题的想法?

c++ multithreading c++11 system-error

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

我需要-D_REENTRANT和-pthreads吗?

在Linux(内核2.6.5)上,我们的构建系统调用gcc -D_REENTRANT.

使用时仍然需要这个pthreads吗?

它与gcc -pthread选项有什么关系?我知道我应该使用-pthreadpthreads,我还需要-D_REENTRANT吗?

另外,你知道在gcc 3.3.3和gcc 4.xx之间使用REENTRANT之间有什么区别吗?

当我使用-pthreadgcc选项时,我可以看到它_REENTRANT被定义了.-D_REENTRANT从命令行省略会有什么不同,例如,某些对象可以在没有多线程支持的情况下编译,然后链接到使用pthreads的二进制文件并导致问题吗?

我认为应该可以使用: g++ -pthread

> echo | g++          -E -dM -c - > singlethreaded
> echo | g++ -pthread -E -dM -c - > multithreaded
> diff singlethreaded multithreaded
39a40
> #define _REENTRANT 1
Run Code Online (Sandbox Code Playgroud)

我们正在编译多个静态库和与静态库链接的应用程序,库和应用程序都使用pthread.

我相信它在过去的某个阶段是必需的,但想知道它是否仍然需要.谷歌搜索没有返回任何最近提到的信息 - D_REENTRANTpthreads.你能指点我讨论在最近版本的kernel/gcc/pthread中使用的链接或引用吗?

澄清:目前我们正在使用-D_REENTRANT和-lpthread,我假设我可以用g ++ -pthread替换它们,看看man gcc它为预处理器和链接器设置了标志.有什么想法吗?

linux gcc pthreads

39
推荐指数
3
解决办法
3万
查看次数

标签 统计

c++ ×3

c++11 ×2

g++ ×2

gcc ×2

linux ×2

multithreading ×2

pthreads ×1

system-error ×1

ubuntu ×1