linux,windows如何避免竞争,同步控制的几点经验

本文分享了在Linux和Windows环境下避免竞争条件和实现同步控制的经验。包括减少全局变量使用、利用信号量和自旋锁保护共享资源、正确获取锁的顺序防止死锁、合理使用自旋锁、循环缓冲区替代锁的应用、线程间通信机制的选择以及Windows多线程编程注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

linux,windows如何避免竞争,同步控制的几点经验
1) 避免使用全局变量,全局变量,指针传递必须特别小心,尤其是在内核;

2)采用信号量,读写信号量,自旋锁,读写自旋锁对共享的数据进行保护,信号量当最大值为1时就相当于互斥量了;

3)如果要获取多个锁,必须以顺序的方式获得,比如有2个锁,lock1和lock2,一个进程必须获取这两个锁才能运行时,必须先获取lock1,在获取lock2,避免一个进程获取了lock1,而另一个进程获取了lock2,造成死锁;

4)使用自旋锁时,因为锁被其它地方获取,则会一直等待,并且重复检查锁,因此在使用自旋锁时,自旋锁必须在尽可能短的时间内拥有;另外,任何拥有自旋锁的代码应为原子的,它不能休眠;事实上,不能因为任何原因放弃处理器,但是现实中并不是这样,所以必须小心使用;for example,许多内核函数都可以休眠,如用户空间到内核空间copy数据,还有当我们获得锁的时候,此时产生了一个中断,而中断处理例程在返回前也要获得这个锁,这样就死锁了。

5)有时可以用循环缓冲区代替锁,就像生产者消费者线程一样,设置一个循环缓冲区和两个移动的指针,就可以控制同步,这种方法在进程之间的通信也可以使用;

6)线程之间的通信可以使用mutex,semaphore,Event控制,其中semaphore,event可以和waitforsingleobject等函数一起使用,来控制2个线程通信;mutex主要用在多个线程同时访问共享数据时,进行保护;

7)windows多线程必须避免在线程中调用 MFC控件等用户界面线程的东东,避免在程序退出时,由于用户界面线程已经退出,而工作者线程不能退出的情况,从而造成程序死掉。如果一定要使用这个东东,记得和  MsgWaitForMultipleObjects函数一起使用;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值