私はVS2015を使用しており、std :: threadを使用すると非常に奇妙な問題が発生します。std :: thread throws引数を使用して作成されたアクセス違反例外?
デバッグモードでは正常に機能しますが、リリースモードに切り替えると「アクセス違反例外」がスローされます。
void Klass::myfunc() { std::cout << "foo" << std::endl; }
// ...
auto t = std::thread(&Klass::myfunc, this); // everything goes well
// ...
t.join();
それが再びうまく機能:私はこれに "myfunc関数" を変更しようとする場合には、より多くの何
。
"& Klass :: myfunc"と "this"ポインタがNULLでないことが保証されています。そしてctorが呼び出されると、いくつかの行の後に "join"があります。
「未定義の動作」のようなものかもしれませんが、正確には何か分かりません。 (この場合はthis
で)
000000c83a4ffd40() Unknown
> distributed_word_embedding.exe!std::_LaunchPad<std::unique_ptr<std::tuple<void (__cdecl multiverso::Communicator::*)(void) __ptr64,multiverso::Communicator * __ptr64>,std::default_delete<std::tuple<void (__cdecl multiverso::Communicator::*)(void) __ptr64,multiverso::Communicator * __ptr64> > > >::_Run(std::_LaunchPad<std::unique_ptr<std::tuple<void (__cdecl multiverso::Communicator::*)(void),multiverso::Communicator *>,std::default_delete<std::tuple<void (__cdecl multiverso::Communicator::*)(void),multiverso::Communicator *> > > > * _Ln) Line 247 C++
distributed_word_embedding.exe!std::_Pad::_Call_func(void * _Data) Line 210 C++
ucrtbase.dll!00007ffabdc7be1d() Unknown
kernel32.dll!00007ffabfae8102() Unknown
ntdll.dll!00007ffac26bc5b4() Unknown
スレッドを作成した後はどうなりますか?あなたはそれに '参加するのですか? – doctorlove
@doctorloveは、これが生涯の問題のように見えることは、スレッドがKlassインスタンスよりも長生きしているため、このポインタがぶら下がっているところです。適切な場所に参加することで、これを防ぐことができます。しかし、私たちは提示された文脈に基づいて確信することはできません。 – stefaanv
@doctorlove stefaanvこんにちは、お返事ありがとうございます。実際には、デバッガとログは、std :: threadのctorが呼び出された直後にプログラムがダウンしていることを示し、「join」は数行後にあります。私は問題が "参加"ではないと思う。そして、私が議論せずに "myfunc"を呼び出すと、すべてがうまくいくという質問にも言及しました。 – Wizmann