程序员的自我修养—线程安全



  1. 原子操作:自增操作在多线程环境下会出现错误,因为该操作的汇编代码不止一条指令,多条指令的执行就有可能会被打断。Windows 的一套专门进行原则操作的API——Interlocked API。
  2. 锁。
  3. 信号量。(内核对象,可进程间共享)
    	HANDLE h = CreateSemaphore(0, 0, 1, TEXT("smp"));
    	WaitForSingleObject(h, 2000);
    	ReleaseSemaphore(h, 1, 0);

  4. 互斥量。(内核对象,可进程间共享)
             CreateMutex(0, 0, TEXT("mutex"));//创建时可选当前线程是否要占有该锁,若占有就需要当前线程来释放
             WaitForSingleObject(hMutex, INFINITE);
             ReleaseMutex(hMutex);
  5. 临界区。(全局变量,进程内使用)
            CRITICAL_SECTION cs;
            InitializeCriticalSection(&cs);
            EnterCriticalSection(&cs);
            LeaveCriticalSection(&cs);
  6. 读写锁。
            SRWLOCK srw;
            InitializeSRWLock(&srw);
                 //一旦初始化完成,就可以对写入线程调用AcquireSRWLockExclusive()函数和ReleaseSRWLockExclusive()函数
            AcquireSRWLockExclusive(&srw);
                 //...写入数据,写入东西的时候该线程独占,其他任何线程不可进入
            ReleaseSRWLockExclusive(&srw);
                 //对于只读线程可以调用AcquireSRWLockShared()函数和ReleaseSRWLockShared()函数,如下
            AcquireSRWLockShared(&srw);
                 //..读取数据,如果这时没有写入数据则多个读取线程可以进行
            ReleaseSRWLockShared)&srw);
  7. 条件变量。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-小蛙-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值