您的位置:首页 > 编程语言 > Qt开发

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用来锁住变量或者对象,另外一个线程不能进入锁定代码的时候,会等待而不是跳过锁定的代码.

是等待。而且是死等,所以设计不好就会线程相互死等,这就是线程死锁。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  多线程