启用多线程 Eclipse C++

Posted

技术标签:

【中文标题】启用多线程 Eclipse C++【英文标题】:Enable multithreading Eclipse C++ 【发布时间】:2015-12-30 17:19:45 【问题描述】:

我一直在尝试让一个程序在 Eclipse C++ 中运行。其中一个函数使用来自 std 的多线程。这是代码中的函数:

void PrimeCheck::checkFull(long long int number)

    std::thread t1(&PrimeCheck::checkFirstHalf, this, number);
    std::thread t2(&PrimeCheck::checkSecondHalf, this, number);

    t1.join();
    t2.join();

在搜索解决方案时,我遇到了许多解决方案,除了将方言更改为 C++11 之外,所有这些解决方案都声明要添加 -pthread 标志或 -std=c++11。所有这些我都做过。这是eclipse中编译命令的样子,所以你可以准确地看到我已经添加了哪些修改:

Building file: ../src/Prime Checker.cpp
Invoking: GCC C++ Compiler
g++ -std=c++0x -D__GXX_EXPERIMENTAL_CXX0X__ -O2 -g -Wall -c -fmessage-length=0 -std=c++11  -pthread -Wl,--whole-archive -lpthread -Wl,--no-whole-archive -MMD -MP -MF"src/Prime Checker.d" -MT"src/Prime\ Checker.d" -o "src/Prime Checker.o" "../src/Prime Checker.cpp"
Finished building: ../src/Prime Checker.cpp

这是出现在 eclipse 中的链接器命令:

Invoking: GCC C++ Linker
g++ -Wl,--no-as-needed -pthread -shared -o [A bunch of .o files]

代码编译正确,Eclipse 内容辅助将线程识别为 std 的成员。然而,当我运行程序时,我仍然出现这个错误:

terminate called after throwing an instance of 'std::system_error'
  what():  Enable multithreading to use std::thread: Operation not permitted

为了测试这一点,我在 Eclipse 之外编写了一个简单的程序,如下所示:

#include <thread>
#include <iostream>

using namespace std;

void func1(int x)
    for(int i=0; i<x; i++)
        cout << " " << 1 + i;
    


void func2()
    for(int j=0; j<5; j++)
        cout << "Standard message! ";
    


int main()
    int input;
    cout << "Give me a number:" << endl;
    cin >> input;

    thread t1(func1, input);
    thread t2(func2);
    t1.join();
    t2.join();


    return 0;

并在终端中编译它:

g++ ThreadTest.cpp -o Program.o -std=c++11 -pthread

程序运行没有错误。我认为这意味着 Eclipse 有问题,但我不确定。

作为说明,我在 Ubuntu 14.04 上使用 gcc 版本 4.8.4 执行此操作。另外,我知道有人问过类似的问题,但据我所知,我实施这些解决方案收效甚微。

我们将不胜感激。谢谢!

【问题讨论】:

首先怀疑是Eclipse调用的g++版本和命令行调用g++的版本不一样。 您如何验证 gcc 版本是否相同?在终端你可以g++ --version,但是在Eclipse中呢? 检查您的工具链设置。 工具链编辑器只提到它正在使用“Linux GCC” 但这意味着什么? ;) 使用了哪些可执行文件? 【参考方案1】:

解决了。在 Ubuntu 14.04 中使用 Eclipse IDE for C/C++ Developers v4.7.3a

1/2。问题描述

只是尝试运行这个示例代码:

mutex.cpp

// mutex example
#include <iostream>       // std::cout
#include <thread>         // std::thread
#include <mutex>          // std::mutex

std::mutex mtx;           // mutex for critical section

void print_block (int n, char c) 
  // critical section (exclusive access to std::cout signaled by locking mtx):
  mtx.lock();
  for (int i=0; i<n; ++i)  std::cout << c; 
  std::cout << '\n';
  mtx.unlock();


int main ()

  std::thread th1 (print_block,50,'*');
  std::thread th2 (print_block,50,'$');

  th1.join();
  th2.join();

  return 0;

发件人:http://www.cplusplus.com/reference/mutex/mutex/

使用以下命令在命令行上构建并运行良好,但不会在 Eclipse 中运行!

在终端中构建和运行的命令行命令就好了:

g++ -Wall -std=c++11 -save-temps=obj mutex.cpp -o ./bin/mutex -pthread && ./bin/mutex

当我尝试在 Eclipse 中运行时出现 Eclipse 错误:

terminate called after throwing an instance of 'std::system_error'  
  what():  Enable multithreading to use std::thread: Operation not permitted

2/2。使其在 Eclipse 中构建和运行的解决方案如下:

A.为编译器启用 pthread:

Project --> Properties --> C/C++ Build --> Settings --> GCC C++ Compiler --> Miscellaneious --> 在“Other flags”框中输入-std=c++11,并勾选“支持 pthread (-pthread)”。在此处查看黄色突出显示:

B.为链接器启用 pthread:

然后,在不关闭此窗口的情况下,也为链接器设置此设置: 在中心窗格中:GCC C++ Linker --> General --> 选中“Support for pthread (-pthread)”复选框,如下所示:

点击“应用并关闭”。它现在将构建并运行。

【讨论】:

以上是关于启用多线程 Eclipse C++的主要内容,如果未能解决你的问题,请参考以下文章

Eclipse客户端程序中多线程的使用[1]

eclipse debug 多线程

c++ 多线程与c多线程有啥区别?

如果 ANSI C++ 不支持多线程,非托管 C++ 应用程序如何实现多线程?

C++多线程怎么实现

vs设置多线程编译的数量