は私が追跡することはできませんよのstd ::例外Invalid_argument例外をキャッチする問題に遭遇しましキャッチすることができません。私はgcc 4.4.0(windows)、pthreads-win32 2.8.0 GC2 dllを使用しています。のstd ::例外Invalid_argument
基本的に、二つのスレッド(メインスレッドとpthread_createの使用を開始スレッド)から、Iは、ほぼ同じ時間に、クラスAのインスタンスを作成しよう。コンストラクタはstd :: invalid_argumentをスローしますが、例外を捕捉するtry/catchブロックで囲まれています。しかし、それは起こりません(非常にまれに、スレッドの1つだけが例外をキャッチする可能性があります)。
スレッドの1つのみでオブジェクトを作成しようとすると、createそれがすべきであるとして動作し、例外がキャッチされます。別の時に2つのオブジェクトを作成すると、createはうまく動作し、例外が捕捉されます。同時にそれらを作成しようとすると、:: terminate()が呼び出されます。
たぶん誰かが(私は、ヘッダーを除外しました)これがなぜ起こるかのアイデアを持っています
void *run(void *ptr)
{
Sleep(5000);
try
{
A *a = new A(5);
a->a = 12;
}
catch (std::exception &ex)
{
printf("t - %s\n", ex.what());
}
return NULL;
}
int main(void) {
pthread_t t;
if (pthread_create(&t, NULL, run, NULL) != 0)
{
printf("No thread\n");
}
else
{
Sleep(5000);
try
{
A *a = new A(5);
a->a = 13;
} catch (std::exception &ex)
{
printf("M - %s\n", ex.what());
}
pthread_join(t, NULL);
}
return 0;
}
class A
{
public:
A(int a);
virtual ~A();
int a;
};
A::A(int a)
{
throw std::invalid_argument("Invalid!");
}
A::~A(){}
メイクファイルは次のとおりです。
CXXFLAGS = -O0 -g -Wall -Werror -fmessage-length=0
OBJS = WOpenTest.o A.o
INCL = -I../pthreads-win32/include
LIBS = -lws2_32 -lgdi32 -lpthreadGC2
LIB_DIRS = -L ../pthreads-win32/lib
TARGET = WOpenTest.exe
$(TARGET): $(OBJS)
$(CXX) -o $(TARGET) $(OBJS) $(LIBS) $(LIB_DIRS) $(INCL)
WOpenTest.o : WOpenTest.cpp
g++ $(CXXFLAGS) -c WOpenTest.cpp $(INCL)
A.o : A.cpp A.h
g++ $(CXXFLAGS) -c A.cpp $(INCL)
all: $(TARGET)
clean:
rm -f $(OBJS) $(TARGET)
私は見ています出力は次のようになります。
(ほとんどしばしば)$ ./WOpenTest.exe
このアプリケーションは、異常な 方法でそれを終了する ランタイムを要求しました。詳細については、アプリケーションの サポートチームにお問い合わせください。
このアプリケーションは、 の方法で異常終了するようにランタイムを要求しています。詳細については、アプリケーションの サポートチームにお問い合わせください。 は、このアプリケーションはへ ランタイムを要求した再帰的
または
$ ./WOpenTest.exe
と呼ばTERMINATE 'のstd ::例外Invalid_argument' の インスタンスを投げた後に呼び出さTERMINATE珍しい方法で終了してください 方法。詳細については、アプリケーションの サポートチームにお問い合わせください。 M - 無効です!
または
$ ./WOpenTest.exe
このアプリケーションは、異常な 方法でそれを終了する ランタイムを要求しました。詳細については、アプリケーションの サポートチームにお問い合わせください。 t - 無効です!
または
このアプリケーションは、異常な 方法でそれを終了する ランタイムを要求しました。詳細については、アプリケーションの サポートチームにお問い合わせください。
このアプリケーションは、 の方法で異常終了するようにランタイムを要求しています。詳細については、アプリケーションの サポートチームにお問い合わせください。 'std :: invalid_argument'のインスタンスをスローした後にterminateが呼び出されます
what():無効です!
私は何をしなければならないと私はしていないのですか?または私はpthreadsで行方不明ですか?
私は答えを見つけた、それはスレッドセーフでないMSVCRT mingwのに沸きます。 – laura