Qt多线程编程: QMutex
2016-09-22 16:11
267 查看
Mutex mutex; void *AllocLarge(pool_t *pool, size_t size) { mutex.lock(); //do something mutex.unlock(); return; } void *AllocLarge(pool_t *pool, size_t size) { QMutexLocker lock(&mutex); //这样可以避免下面的各个分支退出的时候,都要写上unlock... }
实际情况是,CPU分点时间给线程A,A就使命跑,CPU在分点给B线程,B在使劲跑。如果分到B线程的时候,发现锁被占用了,就没办法了。跑不了了
锁是用来保护数据的。你应该为每一个队列设一把锁,任何线程要操作队列,都要先获得这个队列的锁,在使用完队列之后,再释放锁。
就算是读也一样需要加锁
你怎么能够保证,在一个线程读时,另一个线程没对资源修改了。
如果是同时读,都没问题
同时读写,就会出问题了。除非你能保证一个读时,另外一个不在写。操作系统保证不了,只能你自己保证了。
对的,有可能自读的时候正好被修改数值了,看来还是得加锁了.
Mutex是用来实现多个线程的同步的。
最大的分别是Mutex 可以跨过process 的界限
一个链表可以带一个锁。。保证线程的同步。
void fun()
{
lock(_writeLock);
}
semaphore 有时比 mutex 好用
因为 mutex 一次只能有一个线程可以占用资源
semaphore 可有若干个线程。同时占用资源
线程同步本来就是管理一段代码“只有一个线程能够执行它”,线程调度本来就是无有固定顺序的。
Question: 多线程lock 之后不就是单线程了吗.
Answer: lock并不需要锁定所有的操作。操作共享资源的时候,才需要锁定。
Example:
string 下载Url;
lock (list)
{
下载Url = 取出Url(list); // 1毫秒锁定,只能一个线程
}
下载到硬盘(下载Url); // 需要2秒,这里可以多线程下载。
锁(Locks):在一个资源被访问的时候,禁止其他访问;
lock用来锁住变量或者对象,另外一个线程不能进入锁定代码的时候,会等待而不是跳过锁定的代码.
是等待。而且是死等,所以设计不好就会线程相互死等,这就是线程死锁。
相关文章推荐
- Python3写爬虫(四)多线程实现数据爬取
- C#实现多线程的同步方法实例分析
- 浅谈chuck-lua中的多线程
- C#简单多线程同步和优先权用法实例
- C#多线程学习之(四)使用线程池进行多线程的自动管理
- C#多线程编程中的锁系统(三)
- 解析C#多线程编程中异步多线程的实现及线程池的使用
- C#多线程学习之(六)互斥对象用法实例
- 基于一个应用程序多线程误用的分析详解
- C#多线程学习之(三)生产者和消费者用法分析
- C#多线程学习之(一)多线程的相关概念分析
- C#多线程之Thread中Thread.IsAlive属性用法分析
- 分享我在工作中遇到的多线程下导致RCW无法释放的问题
- C#多线程编程之使用ReaderWriterLock类实现多用户读与单用户写同步的方法
- C#多线程传递参数及任务用法示例
- C#控制台下测试多线程的方法
- 21天学习android开发教程之SurfaceView与多线程的混搭
- Ruby 多线程的潜力和弱点分析
- C#中WPF使用多线程调用窗体组件的方法
- C#如何对多线程、多任务管理(demo)