1

私は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。

4

1 に答える 1