同步与互斥这两个概念经常被混淆,所以在这里说一下它们的区别. 一.同步与互斥的区别 1. 同步 同步,又称直接制约关系,是指多个线程(或进程)为了合作完成任务,必须严格按照规定的 某种先后次序来运行. 例如,线程 T2 中的语句 y 要使用线程 T1 中的语句 x 的运行结果,所以只有当语句 x 执行完成之后语句 y 才可以执行.我们可以使用信号量进行同步: semaphore S=0; // 初始化信号量 T1() { ... x; // 语句x V(S); // 告诉线程T2,语句x已经完成…
当多个线程共享相同的内存时,需要确保每个线程看到一致的数据视图,当多个线程同时去修改这片内存时,就可能出现偏差,得到与预期不符合的值.为啥需要同步,一件事情逻辑上一定是有序的,即使在并发环境下:而操作系统对于多线程不会自动帮我们串行化,所以需要我们通过操作系统提供的同步方式api,结合自己的业务逻辑,利用多线程提高性能的同时,保证业务逻辑的正确性.一般而言,linux下同步方式主要有4种,原子锁,互斥量,读写锁和条件变量.下面一一介绍几种同步方式. 1. spinlock 1)  概念 spin…
在linux多线程编程中,线程的执行顺序是不可预知的,但是有时候由于某些需求,需要多个线程在启动时按照一定的顺序执行,虽然可以使用一些比较简陋的做法,例如:如果有3个线程 ABC,要求执行顺序是A-->B-->C,可以create A--->sleep---->create B---->sleep--->create C,但是这未免有点不靠谱,浪费时间不说,如果要求更多,比如要A线程跑起来并且初始化一些条件后,BC才陆续执行,怎么办呢?看到APUE的条件变量这才找到了一…
1. 在并发情况下,指令执行的先后顺序由内核决定.同一个线程内部,指令按照先后顺序执行,但不同线程之间的指令很难说清楚是哪一个先执行.如果运行的结果依赖于多线程执行的顺序,那么就会形成竞争条件,每次运行的结果可能会不同,所以应该尽量避免竞争条件的形成. 2. 最常见的解决竞争条件的方法是将原先分离的两个指令构成一个不可分割的原子操作,其他任务就不能插入到原子操作中! 3. 对多线程来说,同步指的是在一定时间内只允许某一个线程访问某个资源,而在此时间内,不允许其他线程访问该资源! 4. 线程同步的…
1.  互斥量,Mutex #include <Windows.h> #include <iostream> using namespace std; DWORD WINAPI Thread1(LPVOID lpParmeter); DWORD WINAPI Thread2(LPVOID lpParmeter); static HANDLE g_hMutex = INVALID_HANDLE_VALUE; static int g_iCnt = 100; int main() {…
1.  互斥量,Mutex #include <Windows.h> #include <iostream> using namespace std; DWORD WINAPI Thread1(LPVOID lpParmeter); DWORD WINAPI Thread2(LPVOID lpParmeter); static HANDLE g_hMutex = INVALID_HANDLE_VALUE; ; int main() { HANDLE hThread1 = INVAL…
http://blog.163.com/he_junwei/blog/static/19793764620141711130253/ http://blog.csdn.net/h_armony/article/details/6766505  一.互斥锁 尽管在Posix Thread中同样可以使用IPC的信号量机制来实现互斥锁mutex功能,但显然semphore的功能过于强大了,在Posix Thread中定义了另外一套专门用于线程同步的mutex函数. 1. 创建和销毁 有两种方法创建互斥…
1. 为什么需要互斥: ​互斥操作  保证了  多线程操作的  原子性 , java的 互斥 语义 有 synchronized 关键字 提供. 主要方式 有  同步代码块 和  同步方法 两种 2. 整数自增操作 常见的线程安全问题: 从内存中 读数据  到寄存器,<---进入一个线程 从寄存器 +1 写会内存 像这种不是一条指令就能完成的操作 ,并且 有多个线程操作统一资源的时候 ,要保证 上面 三步操作一次执行完,而不被其他线程干扰(原子性:要么  都不执行 ,要么 全部执行) 3. 线程…
一.概述                                                   互斥量是线程同步的一种机制,用来保护多线程的共享资源.同一时刻,只允许一个线程对临界区进行访问. 互斥量的工作流程:创建一个互斥量,把这个互斥量的加锁调用放在临界区的开始位置,解锁调用放到临界区的结束位置.当内核优先把某个线程调度到临界区的开始位置时,线程执行这个加锁调用,并进入临界区对资源进行操作.此时其他线程再被内核调度到这里的时候,由于该互斥量已被加锁状态,得不到锁会一直阻塞在这里…
多线程并行运行,共享同一种互斥资源时,需要上互斥锁来运行,主要是用到pthread_mutex_lock函数和pthread_mutex_unlock函数对线程进行上锁和解锁 下面是一个例子: #include <stdio.h>#include <stdlib.h>#include <pthread.h> #define THREAD_NUMBER        3            /* 线程数 */#define REPEAT_NUMBER        3 …