私はいくつかのソケット、スレッド、ミューテックスで遊んでいます。私の質問はスレッドとミューテックスに関するものです:
int ConnectionHandler::addNewSocket(){
this->connectionList_mutex.lock();
std::cout << "test1" << std::endl;
this->connectionList_mutex.unlock();
return 0;
}
int ConnectionHandler::main(){
while(true){
this->connectionList_mutex.lock();
std::cout << "test2" << std::endl;
this->connectionList_mutex.unlock();
}
}`
main関数は1つのスレッドで実行されていますが、addNewSocketは別のスレッドによって呼び出されています。問題は、addNewSocketが(2番目のスレッドによって)1回呼び出されると、スレッド1(メイン)による次のロック解除が奇妙な「シグナルSIGABRT」で失敗することです。私は今これに2日間取り組んできましたが、残念ながらそれを修正することができませんでした。あなたが私を助けてくれることを願っています。
編集:ConnectionHandlerは、connectionList_mutexをメンバーとして持つクラスです。
編集:時々私はこのエラーも受け取ります:「アサーションに失敗しました:(ec == 0)、関数のロック解除、ファイル/SourceCache/libcxx/libcxx-65.1/src/mutex.cpp、44行目」しかし、それはランダムに発生します。
編集:これはクラス全体です(最小限に抑えられ、ある程度コンテキストに依存しないはずですが、クライアントが接続された直後に配置するとクラッシュし、開始直後に配置すると機能します:
class ConnectionHandler{
public:
ConnectionHandler();
int addNewSocket();
private:
int main();
static void start(void * pThis);
std::mutex connectionList_mutex;
};
ConnectionHandler::ConnectionHandler(){
std::thread t(&this->start, this);
t.detach();
}
void ConnectionHandler::start(void * pThis){
ConnectionHandler *handlerThis;
handlerThis = (ConnectionHandler *)pThis;
handlerThis->main();
}
int ConnectionHandler::addNewSocket(){
this->connectionList_mutex.lock();
std::cout << "test1" << std::endl;
this->connectionList_mutex.unlock();
return 0;
}
int ConnectionHandler::main(){
while(true){
this->connectionList_mutex.lock();
std::cout << "test2" << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(100));
this->connectionList_mutex.unlock();
}
}