线程同步——用户模式下线程同步——Slim读写锁实现线程同步
2014-08-16 11:01
316 查看
//Slim读/写锁实现线程同步 SRWlock 的目的和关键段相同:对同一资源进行保护,不让其它线程访问。 但是,与关键段不同的是,SRWlock允许我们区分哪些想要读取资源的线程(读取者线程) 和哪些想要更新资源值的线程(写入者线程)。让所有读取者资源在同一时刻访问共享资源应该是 可行的,这是因为仅仅读取资源并不存在破坏数据的风险。只有当写入者线程想要对资源进行更新时才需要同步。 这种情况下,写入者线程应该独占资源访问权:任何线程,无论是读取还是写入者线程,都不许访问资源。 这就是SRWlock强大之处。 //使用步骤: //(1)必须先定义 CRITICAL_SECTION 结构 SRWLOCK g_cs; //(2)初始化关键段 SRWLOCK InitializeSRWLock(&g_cs); //3)写入者线程 DWORD WINAPI ThreadFunOne(PVOID pvParam) { AcquireSRWLockExclusive(&g_cs) ; //写入资源 应该放在AcquireSRWLockExclusive和ReleaseSRWLockExclusive函数之间 g_x ++ ; ReleaseSRWLockExclusive(&g_cs); return 0; } //4)读取者线程 DWORD WINAPI ThreadFunTwo(PVOID pvParam) { AcquireSRWLockShared(&g_cs) ; //读取资 源应该放在AcquireSRWLockShared和ReleaseSRWLockShared函数之间 cout<<"ThreadFunTwo:"<<g_x<<endl ; ReleaseSRWLockShared(&g_cs); return 0; } 不存在用来删除或者销毁 SRWLOCK 的函数,因为系统会自动执行清理工作 与关键段相比,SRWlock 缺乏两个特性。 1)不存在TryEnter(Shared/Exclusive)SRWLock之类的函数:如果锁已经被占用, 那么调用AcquireSRWLock(Shared/Exclusive)会阻塞调用线程。 2)不能递归的获得 SRWLOCK 也就是说一个线程不能多次写入资源而多次锁定资源, 然后多次调用ReleaseSRWLock*来释放资源锁定。 #include "windows.h" #include "iostream" using namespace std; long g_x = 0 ; //(1)必须先定义 CRITICAL_SECTION 结构 SRWLOCK g_cs; //定义线程函数1 DWORD WINAPI ThreadFunOne(PVOID pvParam) ; //定义线程函数2 DWORD WINAPI ThreadFunTwo(PVOID pvParam); int main() { //(2)初始化关键段 SRWLOCK InitializeSRWLock(&g_cs); //创建线程1 HANDLE hThreadOne = CreateThread(NULL,0,ThreadFunOne,0,0,NULL); CloseHandle(hThreadOne); //创建线程2 HANDLE hThreadTwo = CreateThread(NULL,0,ThreadFunTwo,0,0,NULL); CloseHandle(hThreadTwo); //让主线程先挂起,确保其它线程执行完成 Sleep(1000); cout<<g_x<<endl; //(4)清理CRITICAL_SECTION结构,必须确保已经没有资源使用此关键段,否则会出现不可预料的结果 return 0 ; } DWORD WINAPI ThreadFunOne(PVOID pvParam) { AcquireSRWLockExclusive(&g_cs) ; //写入资源 应该放在AcquireSRWLockExclusive和ReleaseSRWLockExclusive函数之间 g_x ++ ; ReleaseSRWLockExclusive(&g_cs); return 0; } DWORD WINAPI ThreadFunTwo(PVOID pvParam) { AcquireSRWLockShared(&g_cs) ; //读取资 源应该放在AcquireSRWLockShared和ReleaseSRWLockShared函数之间 cout<<"ThreadFunTwo:"<<g_x<<endl ; ReleaseSRWLockShared(&g_cs); return 0; }
相关文章推荐
- 线程同步——用户模式下线程同步——关键段实现线程同步
- 线程同步——用户模式下线程同步——Interlocked实现线程同步
- 第8章 用户模式下的线程同步(3)_Slim读写锁(SRWLock)
- Windows核心编程:用户模式下的线程同步
- Windows Via C/C++:用户模式下的线程同步——Condition Variables 条件变量
- 《Windows via C/C++》学习笔记 —— 用户模式的“线程同步”之“条件变量”
- 在Forms验证模式下,实现多个站点(SubDomain相同)共享同一用户登录状态
- 用APC实现在内核模式运行用户程序
- 第八章:用户模式下的线程同步
- Windows Via C/C++:用户模式下的线程同步——临界区 Critical Sections
- Windows Via C/C++:用户模式下的线程同步——轻量级读写锁(Slim Reader-Writer Locks)
- CLR via C# 读书笔记 4-1 线程同步-常见的锁,原生用户模式和核心模式 (上)
- 在Forms验证模式下,实现多个站点(SubDomain相同)共享同一用户登录状态
- 《Windows核心编程》第8章 用户模式下的线程同步
- Windows via C/C++ 学习(16)用户模式下的线程同步(一)
- 核心编程笔记8——用户模式下的线程同步
- 在Forms验证模式下,实现多个站点(SubDomain相同)共享同一用户登录状态
- 实现了观察者模式的用户控件。
- 用户模式的线程同步原子访问:InterLocked互锁函数
- windows 核心编程(用户模式下的线程同步)