使用mutex时报错std::system_error
时间: 2024-01-19 10:04:24 浏览: 116
当使用std::mutex时,可能会出现std::system_error异常,这通常是由于创建线程时未正确传递可执行对象或可执行对象参数不正确导致的。下面是一些常见的错误和解决方法:
1. 错误:使用std::thread创建线程时未正确传递可执行对象。
示例代码:
```c++
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx;
int data = 0;
void worker() {
for (int i = 0; i < 100; i++) {
mtx.lock();
data++;
mtx.unlock();
}
}
int main() {
std::thread t(worker); // 错误:未正确传递可执行对象
t.join();
std::cout << "Data = " << data << std::endl;
return 0;
}
```
解决方法:将可执行对象作为std::thread的参数传递。
修改后的示例代码:
```c++
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx;
int data = 0;
void worker() {
for (int i = 0; i < 100; i++) {
mtx.lock();
data++;
mtx.unlock();
}
}
int main() {
std::thread t(&worker); // 传递可执行对象
t.join();
std::cout << "Data = " << data << std::endl;
return 0;
}
```
2. 错误:使用std::thread创建线程时可执行对象参数不正确。
示例代码:
```c++
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx;
int data = 0;
void worker(std::mutex& m, int& d) { // 错误:未传递std::mutex和int的引用
for (int i = 0; i < 100; i++) {
m.lock();
d++;
m.unlock();
}
}
int main() {
std::thread t(worker); // 可执行对象参数不正确
t.join();
std::cout << "Data = " << data << std::endl;
return 0;
}
```
解决方法:将std::mutex和int作为参数传递给可执行对象。
修改后的示例代码:
```c++
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx;
int data = 0;
void worker(std::mutex& m, int& d) { // 传递std::mutex和int的引用
for (int i = 0; i < 100; i++) {
m.lock();
d++;
m.unlock();
}
}
int main() {
std::thread t(worker, std::ref(mtx), std::ref(data)); // 传递std::mutex和int的引用
t.join();
std::cout << "Data = " << data << std::endl;
return 0;
}
```
以上就是使用std::mutex时可能出现std::system_error异常的一些常见情况和解决方法。
阅读全文