我一直在努力让程序在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进行此操作。另外,我知道有类似的问题已被提出,但据我所知,我已经实施了这些解决方案,但收效甚微。
帮助将不胜感激。谢谢!
答案 0 :(得分:0)
已解决。在 Ubuntu 14.04 中使用 Eclipse IDE for C / C ++ Developers v4.7.3a 。
只需尝试运行以下示例代码:
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
项目->属性-> C / C ++构建->设置-> GCC C ++编译器->其他->在-std=c++11
中键入“其他标志”框,然后选中“支持pthread(-pthread)”框。看到黄色突出显示在这里:
然后,在没有关闭此窗口的情况下,还为链接器设置此设置: 在中心窗格中:GCC C ++链接器->常规->选中“支持pthread(-pthread)”框,如下所示:
点击“应用并关闭”。现在它将构建并运行。