g++4.7を使用してC++11シードライブラリを使用しようとしています。最初に質問があります。次のリリースでは、pthreadライブラリを手動でリンクする必要がないのでしょうか。
だから私のプログラムは:
#include <iostream>
#include <vector>
#include <thread>
void f(int i) {
std::cout<<"Hello world from : "<<i<<std::endl;
}
int main() {
const int n = 4;
std::vector<std::thread> t;
for (int i = 0; i < n; ++i) {
t.push_back(std::thread(f, i));
}
for (int i = 0; i < n; ++i) {
t[i].join();
}
return 0;
}
私は次のようにコンパイルします:
g++-4.7 -Wall -Wextra -Winline -std=c++0x -pthread -O3 helloworld.cpp -o helloworld
そしてそれは戻ります:
Hello world from : Hello world from : Hello world from : 32
2
pure virtual method called
terminate called without an active exception
Erreur de segmentation (core dumped)
問題とその解決方法は何ですか?
アップデート:
現在mutexを使用しています:
#include <iostream>
#include <vector>
#include <thread>
#include <mutex>
static std::mutex m;
void f(int i) {
m.lock();
std::cout<<"Hello world from : "<<i<<std::endl;
m.unlock();
}
int main() {
const int n = 4;
std::vector<std::thread> t;
for (int i = 0; i < n; ++i) {
t.push_back(std::thread(f, i));
}
for (int i = 0; i < n; ++i) {
t[i].join();
}
return 0;
}
戻ります:
pure virtual method called
Hello world from : 2
terminate called without an active exception
Abandon (core dumped)
更新2:うーん...デフォルトのGCC(g ++ 4.6)で動作しますが、手動でコンパイルしたバージョンのgcc(g ++ 4.7.1)では失敗します。g ++ 4.7.1をコンパイルするのを忘れたオプションはありましたか?