Tôi đang chơi xung quanh với một số ổ cắm, ren và mutex. Câu hỏi của tôi liên quan đến chủ đề và mutexes:Mở khóa Mutex không thành công lạ
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();
}
}`
Chức năng chính đang chạy trong một chuỗi, trong khi addNewSocket được gọi bởi một chuỗi khác. Vấn đề là, khi addNewSocket được gọi một lần (theo luồng thứ hai), mở khóa tiếp theo theo luồng 1 (chính) sẽ thất bại với một tín hiệu lạ "SIGABRT". Tôi đã làm việc hai ngày về điều này bây giờ, nhưng tôi đã không quản lý để làm cho nó cố định, thật đáng buồn. Tôi hy vọng bạn có thể giúp tôi.
Chỉnh sửa: ConnectionHandler là một lớp, có connectionList_mutex là thành viên.
Chỉnh sửa: Đôi khi tôi cũng gặp phải lỗi này: "Xác nhận không thành công: (ec == 0), mở khóa chức năng, tệp /SourceCache/libcxx/libcxx-65.1/src/mutex.cpp, dòng 44." nhưng nó xảy ra ngẫu nhiên.
Chỉnh sửa: Đây là toàn bộ lớp (Giảm đến mức tối thiểu, phải là bối cảnh độc lập ở mức độ nhất định, nhưng bị treo khi tôi đặt nó ngay sau khi khách hàng kết nối và hoạt động nếu tôi đặt ngay sau khi bắt đầu:
..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();
}
}
Tại sao thẻ std? Là mutex std của bạn :: mutex hoặc một cái gì đó? –
có mutex và thread đều là C++ 11 std – sh4kesbeer
ok, có lẽ tôi ngu ngốc, nhưng bây giờ (tôi đã tạo ra một mã nhỏ) hoạt động, tôi chỉ cần tìm ra, tại sao nó không hoạt động trong ngữ cảnh của tôi chương trình thực sự – sh4kesbeer