互斥锁
#include <bits/stdc++.h>
using namespace std;
bool lock_flag;
bool TestAndSet(bool *lock_flag)
{
bool old = *lock_flag;
*lock_flag = true;
return old;
}
void use()
{
while (TestAndSet(&lock_flag));
printf("正在访问临界资源...\n");
lock_flag = false;
}
int main()
{
use();
use();
use();
use();
return 0;
}
读写锁
#include <iostream>
#include <vector>
#include <mutex>
#include <thread>
class readWriteLock {
private:
std::mutex readMtx;
std::mutex writeMtx;
int readCnt;
public:
readWriteLock() : readCnt(0) {}
void readLock()
{
readMtx.lock();
if (++readCnt == 1) {
writeMtx.lock();
}
readMtx.unlock();
}
void readUnlock()
{
readMtx.lock();
if (--readCnt == 0) {
writeMtx.unlock();
}
readMtx.unlock();
}
void writeLock()
{
writeMtx.lock();
}
void writeUnlock()
{
writeMtx.unlock();
}
};
volatile int var = 10;
readWriteLock rwLock;
void Write() {
rwLock.writeLock();
var += 10;
std::cout << "write var : " << var << std::endl;
rwLock.writeUnlock();
}
void Read() {
rwLock.readLock();
std::cout << "read var : " << var << std::endl;
rwLock.readUnlock();
}
int main() {
std::vector<std::thread> writers;
std::vector<std::thread> readers;
for (int i = 0; i < 10; i++) {
writers.push_back(std::thread(Write));
}
for (int i = 0; i < 100; i++) {
readers.push_back(std::thread(Read));
}
for (auto& t : writers) {
t.join();
}
for (auto& t : readers) {
t.join();
}
std::cin.get();
}