同步机制

Linux下线程pthread以及锁的一些总结和代码参考

大城市里の小女人 提交于 2020-03-01 04:58:55
对于linux下线程pthread的认识以及锁的相关概念等等,作为小白的我推荐这一篇比较好的文章,也谢谢大牛的分享: http://casatwy.com/pthreadde-ge-chong-tong-bu-ji-zhi.html 对于只使用基本mutex的同学,摘录文章中的一段话,共同勉励,一起养成良好的编码规范: 如果要进入一段临界区需要多个mutex锁,那么就很容易导致死锁,单个mutex锁是不会引发死锁的。要解决这个问题也很简单,只要申请锁的时候 按照固定顺序,或者及时释放不需要的mutex锁就可以。这就对我们的代码有一定的要求,尤其是全局mutex锁的时候,更需要遵守一个约定。 如果是全局mutex锁,我习惯将它们写在同一个头文件里。 一个模块的文件再多,都必须要有两个umbrella header file。一个是整个模块的伞,外界使用你的模块的时候,只要include这个头文件即可。另一个用于给模块的所有子模块去include,然后这个头 文件里面就放一些公用的宏啊,配置啊啥的,全局mutex放在这里就最合适了。 这两个文件不能是同一个,否则容易出循环include的问题。如果有人写 模块不喜欢写这样的头文件的,那现在就要改了。 然后我的mutex锁的命名规则就是: 作用_mutex_序号 ,比 如 LinkListMutex_mutex_1 ,

Java多线程基础篇(04)-线程同步机制和线程间通信

為{幸葍}努か 提交于 2019-12-05 15:08:40
1.线程的等待与唤醒 本节包括wait(),notify(),notifyAll()介绍。以及为什么notify,wait等方法要定义在Object中而不是Thread中。 1.1 wait,notify,notifyAll方法介绍 在Object中,定义了wait(), notify()和notifyAll()等接口。wait()的作用是让当前线程进入等待状态, 同时,wait()也会让当前线程释放它所持有的锁 。而notify()和notifyAll()的作用,则是 唤醒当前对象上的等待线程 ;notify()是唤醒单个线程,而notifyAll()是唤醒所有的线程。 Object类中关于等待/唤醒的API详细信息如下: notify() -- 唤醒在此对象监视器上等待的单个线程。 notifyAll() -- 唤醒在此对象监视器上等待的所有线程。 wait() -- 让当前线程处于“等待(阻塞)状态”,“直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法”,当前线程被唤醒(进入“就绪状态”)。 wait(long timeout) -- 让当前线程处于“等待(阻塞)状态”,“直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量”,当前线程被唤醒(进入“就绪状态”)。 wait(long

Effective Objective-C Notes:GCD 实现同步锁

我们两清 提交于 2019-12-04 19:03:57
本文名为《GCD 实现同步锁》,内容不止于锁。文章试图通过 GCD 同步锁的问题,尽量往外延伸扩展,以讲解更多 GCD 同步机制的内容。 引语:线程安全问题 如果一段代码所在的进程中有多个线程在同时运行,那么这些线程就有可能会同时运行这段代码。假如多个线程每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。 由于可读写的全局变量及静态变量可以在不同线程修改,所以这两者也通常是引起线程安全问题的所在。在 Objective-C 中还包括属性和实例变量(实际上属性和实例变量本质上也可以看做类内的全局变量)。 Objective-C 同步锁 在 Objective-C 中,如果有多个线程执行同一份代码,那么有可能会出现线程安全问题。这种情况下,就需要一个同步机制来解决 —— 锁(lock)。在 Objective-C 中,有如下几种可用的锁: NSLock 实现锁 NSLock是Cocoa提供给我们最基本的锁对象,这也是我们经常所使用的锁之一。 . @synchronized 关键字构建的锁 synchronized指令实现锁的优点就是我们不需要在代码中显式的创建锁对象,便可以实现锁的机制