我的具体需求是A线程执行read时,B线程阻塞,A线程执行完read后,B线程恢复,那么我该使用读写锁、信号量sem、互斥锁mutex还是信号cond,请告诉我在C/C++怎么办
时间: 2024-11-09 19:27:39 浏览: 8
linux创建线程之pthread_create的具体使用
5星 · 资源好评率100%
要实现你描述的需求,即A线程读取数据时,B线程等待,A线程完成后再唤醒B线程,可以使用互斥锁(mutex)或者条件变量(cond)。互斥锁用于控制对共享资源的访问权限,而条件变量则允许线程在满足特定条件时被唤醒。
在C++中,你可以这样做:
1. 使用互斥锁Mutex[^1]:
```cpp
#include <mutex>
#include <thread>
std::mutex mtx;
bool dataReady = false; // 标记数据是否准备好
void readerThread() {
std::lock_guard<std::mutex> lock(mtx);
// A线程读取数据...
dataReady = true; // 设置数据已准备
lock.unlock();
}
void writerThread() {
while (!dataReady) {
std::unique_lock<std::mutex> lock(mtx);
// B线程等待直到数据准备好
std::this_thread::yield(); // 或者调用其他同步原语
lock.unlock();
}
// B线程开始执行...
}
```
2. 使用条件变量Cond:
```cpp
#include <condition_variable>
#include <thread>
std::condition_variable cv;
bool dataReady;
void readerThread() {
// A线程读取数据...
dataReady = true;
cv.notify_one(); // 唤醒等待的writerThread
}
void writerThread() {
std::unique_lock<std::mutex> lock(cv_mutex);
cv.wait(lock, []{ return dataReady; }); // 等待直到数据准备好
// B线程开始执行...
}
```
在这两个方案中,`readerThread()`完成后会设置标志或通知其他线程,`writerThread()`会根据标志或条件变量的改变来决定何时继续执行。
阅读全文