C++学习笔记(1)读写锁
利用C++14中std::shared_timed_mutex实现读写锁
std::unique_lockstd::shared_timed_mutex 可以创建写锁
std::shared_lockstd::shared_timed_mutex 可以创建读锁
完整实现
#include <shared_mutex>
#include <algorithm>
#include <thread>
#include <chrono>
#include <vector>
//< 定义读写锁、自动写锁、自动读锁
typedef std::shared_timed_mutex RWLock;
typedef std::unique_lock<RWLock> AutoWriteLock;
typedef std::shared_lock<RWLock> AutoReadLock;
int main(int argc, char* argv[])
{
RWLock oLock;
std::vector<std::thread> vecWriteThreadWorkers;
int nIndex = 0;
for (size_t i = 0; i < 10; i++)
{
vecWriteThreadWorkers.push_back(std::thread([&](int* pIndex, int nSerial)
{
AutoWriteLock oGuard(oLock);
printf("write thread start:serial = %d\n", nSerial);
for (size_t i = 0; i < 10000; i++)
{
int n = *pIndex;
*pIndex = ++n;
}
std::this_thread::sleep_for(std::chrono::milliseconds(100));
printf("write thread end:serial = %d\n", nSerial);
}, &nIndex,i));
}
std::vector<std::thread> vecReadThreadWorkers;
for (size_t i = 0; i < 10; i++)
{
vecReadThreadWorkers.push_back(std::thread([&](int nSerial)
{
AutoReadLock oGuard(oLock);
printf("read thread start:serial = %d\n", nSerial);
std::this_thread::sleep_for(std::chrono::milliseconds(100));
printf("read thread end:serial = %d\n", nSerial);
}, i));
}
std::for_each(vecWriteThreadWorkers.begin(), vecWriteThreadWorkers.end(), [](std::thread& t)
{
t.join();
});
std::for_each(vecReadThreadWorkers.begin(), vecReadThreadWorkers.end(), [](std::thread& t)
{
t.join();
});
printf("thread finish:nIndex = %d\n", nIndex);
return 0;
}
输出: