多线程
文章平均质量分 89
FreeeLinux
A3GM5H3647LPD4QVYMYAER2S47P4WZ2UKBXBCGZES2V62WEY2HULQA
展开
-
多线程编程的锁问题解析(锁竞争死锁活锁及Date Race等)
为了防止例1中的数据竞跑现象,我们可以使用锁来保证每个线程对counter++操作的独占访问(即保证该操作是原子的)。在例3的程序中,我们使用mutex锁将counter++操作放入临界区中,这样同一时刻只有获取锁的线程能访问该临界区,保证了counter++的原子性:即只有在线程1执行完counter++的三条指令之后线程2才能执行counter++操作,保证了counter的最终值必定为2。原创 2017-01-05 12:28:21 · 4501 阅读 · 1 评论 -
自旋锁与互斥锁的对比、手工实现自旋锁
本文之前,我只是对自旋锁有所了解,知道它是做什么的,但是没有去测试实现过,甚至以为自旋锁只有kernel用这个,今天才发现POSIX有提供自旋锁的接口。下面我会分析一下自旋锁,并代码实现自旋锁和互斥锁的性能对比,以及利用C++11实现自旋锁。一:自旋锁(spin lock) 自旋锁是一种用于保护多线程共享资源的锁,与一般互斥锁(mutex)不同之处在于当自旋锁尝试获取锁时以忙原创 2016-12-16 17:31:50 · 19913 阅读 · 2 评论 -
最高效的进(线)程间通信机制--eventfd
我们常用的进程(线程)间通信机制有管道,信号,消息队列,信号量,共享内存,socket等等,其中主要作为进程(线程)间通知/等待的有管道pipe和socketpair。线程还有特别的condition。今天来看一个liunx较新的系统调用,它是从LINUX 2.6.27版本开始增加的,主要用于进程或者线程间的通信(如通知/等待机制的实现)。首先来看一下函数原型:#include原创 2016-12-08 00:03:45 · 6896 阅读 · 0 评论 -
多线程程序与fork()分析
我们在编写服务器程序时,要么使用多线程,要么使用多进程。如果我们在多线程程序中使用了fork(),这会带来很多不必要的麻烦,甚至带来死锁。示例:#include #include #include #include #include using namespace std;pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZ原创 2016-12-01 22:30:24 · 1135 阅读 · 0 评论 -
使用yeild实现spinlock
一、什么是spinlockspinlock又称自旋锁,是实现保护共享资源而提出一种锁机制。自旋锁与互斥锁比较类似,都是为了解决对某项资源的互斥使用无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一个保持者,只能有一个执行单元获得锁。但是两者在调度机制上略有不同。对于互斥锁,如果资源已经被占用,资源申请者只能进入睡眠状态。但是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调转载 2017-05-10 21:10:16 · 749 阅读 · 0 评论