ここに来るのは初めてです... マルチスレッドの C++ コードを使用しようとしています。私は Mac OSX 10.7.2 を使用しています。OS とコンパイラが古く、c++11 をサポートしていないため、こちらの指示に従いまし たhttps://solarianprogrammer.com/2013/06/11/compiling-gcc-mac-os-x/ gcc 4.9.1が動作していますが、マルチスレッドを試してみました。
#include <thread>
using namespace std;
class X {
public:
char *p;
X() : p(0) { }
~X() { if (p) delete[] p; }
void set(int n) { p = new char[n]; }
};
void task()
{
static thread_local X x;
x.set(8*23);
}
int main()
{
thread t1(task);
thread t2(task);
thread t3(task);
thread t4(task);
thread t5(task);
t1.join();
t2.join();
t3.join();
t4.join();
t5.join();
}
さて、これを次のようにコンパイルすると
/usr/gcc-4.9.1/bin/g++-4.9.1 -g -std=c++11 simple.c
次のようなエラーが表示されます。
a.out(50392,0x100605000) malloc: * オブジェクト 0x137fe130400db0 のエラー: 解放中のポインターが割り当てられていません * malloc_error_break にブレークポイントを設定して、不正な命令をデバッグします: 4
a.out(50405,0x102a70000) malloc: * オブジェクト 0x137fcf22500060 のエラー: 解放中のポインターが割り当てられていません * malloc_error_break にブレークポイントを設定して、不正な命令をデバッグします: 4
コマンドライン オプションとして -pthread と -lpthread を追加しようとしましたが、役に立ちませんでした。print ステートメントも追加しました。これにより、エラー メッセージ内のアドレスが静的ローカル オブジェクト自体のアドレスであることが明らかになりました。
あまりにも時代遅れの環境でこれを実行しようとしているのかもしれません。または、適切なランタイムがリンクされていない可能性があります。誰かが助けてくれるかどうかはわかりません...おそらく、より最新のシステムにアクセスする必要があるだけかもしれません。
ありがとう!!