私はc++の初心者ですが、c ++ 11のスレッドで遊んでいると、「セグメンテーション違反(コアダンプ)」が発生しました。作成に使用した優れたコードを変更したところ、エラーが発生しました。私が変更した部分は
mutex m;
auto thread_f=[&](int i)
{
for(int j=i; j<interval.size(); j+=Threads_Number)
{
vector<Permutation >::iterator it1=(interval.begin()+j);
for(vector<Permutation >::iterator it2=it1; it2!=interval.end(); it2++)
{
if(!(*it1<*it2)) continue;
IntervalToCheck x(*it1,*it2);
m.lock();
cout<<x;
f<<x;
m.unlock();
}
}
};
vector<thread> threads;
threads.clear();
for(int i=0; i<Threads_Number; i++)
threads.push_back(thread(thread_f,i));
for(auto& th:threads)
th.join();
ここで、バリアント「f」はofstreamのオブジェクトです。「Threads_Number」を1に設定するとプログラムが正常に動作し、「Threads_Number」を1以外に設定すると、プログラムが正常に動作する場合と動作しない場合があります---intを初期化しない昔のようにそしてそれを使用します。
そしてこれは私のg++バージョンです:
aalen@CFC:multiThreads> g++ --version 13-02-25 14:24
g++ (GCC) 4.7.2
Copyright (C) 2012 Free Software Foundation, Inc.
私は使用します:
g++ -c main.cpp --std=c++11
g++ *.o -o work -lcln -lginac -pthread
コードをコンパイルします。そして、あなたの注意に感謝します、私の貧弱な英語をお詫びします。
IntervalToCheckクラスでGiNaCを使用していて、スレッドセーフではないため(GiNacとスレッドセーフをグーグルで検索したため)、次のメッセージが表示されたためと思われます。
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffff5340700 (LWP 3125)]
0x00000000004097cf in GiNaC::ptr<GiNaC::basic>::operator= (this=0x7fffec000cd0, other=...) at /usr/include/ginac/ptr.h:88
88 delete p;
nmが示唆するようにgdbから。多分GiNaCが問題です。誰かが表現を処理するためのオープンツールを提供できれば、それは素晴らしいことです。読書のためのthx。