线程同步

转载 2015年07月09日 17:23:30

线程同步

同步就是协同步调,按预定的先后次序进行运行。如:你说完,我再说。

“同”字从字面上容易理解为一起动作

其实不是,“同”字应是指协同、协助、互相配合。

如进程、线程同步,可理解为进程或线程A和B一块配合,A执行到一定程度时要依靠B的某个结果,于是停下来,示意B运行;B依言执行,再将结果给A;A再继续操作。
所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回,同时其它线程也不能调用这个方法。按照这个定义,其实绝大多数函数都是同步调用(例如sin, isdigit等)。但是一般而言,我们在说同步、异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务。例如Window API函数SendMessage。该函数发送一个消息给某个窗口,在对方处理完消息之前,这个函数不返回。当对方处理完毕以后,该函数才把消息处理函数所返回的LRESULT值返回给调用者。
在多线程编程里面,一些敏感数据不允许被多个线程同时访问,此时就使用同步访问技术,保证数据在任何时刻,最多有一个线程访问,以保证数据的完整性。
在C++ 11里面,通过std::mutex的加锁和解锁来保证。例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<mutex>
#include<thread>
 
usingnamespacestd;
 
mutexm;
 
voidthreadFunc(inti)
{
m.lock();
//在这里写上你需要的代码
m.unlock();
}
 
intmain()
{
threadt1(threadFunc,1);
threadt2(threadFunc,2);
t1.join();
t2.join();
return0;
}
线程同步的方式和机制

临界区、互斥量、事件、信号量四种方式
临界区(Critical Section)、互斥量(Mutex)、信号量(Semaphore)、事件(Event)的区别
1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占。
2、互斥量:采用互斥对象机制。 只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享
3、信号量:它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目
4、事 件: 通过通知操作的方式来保持线程的同步,还可以方便实现对多个线程的优先级比较的操作
http://baike.baidu.com/view/6501899.htm#2

线程同步的实现

  • 2017年08月25日 16:27
  • 964B
  • 下载

Linux 线程同步的三种方法

线程的最大特点是资源的共享性,但资源共享中的同步问题是多线程编程的难点。linux下提供了多种方式来处理线程同步,最常用的是互斥锁、条件变量和信号量。 一、互斥锁(mutex) 通过锁机制实现线程...
  • zsf8701
  • zsf8701
  • 2012年08月08日 17:20
  • 41876

线程同步编程实例

  • 2012年04月13日 10:32
  • 1.14MB
  • 下载

线程同步 vc

  • 2012年03月08日 00:04
  • 3.61MB
  • 下载

Java之美[从菜鸟到高手演变]之线程同步的引入

从上一章(Java之美[从菜鸟到高手演变]之多线程简介)中,我们了解了关于多线程开发的一些概念,本章我们将通过具体事例引入线程同步问题,后续会不断的提出线程同步的方法。我们知道,采用多线程可以合理利用...

基于Linux 线程同步

  • 2012年03月02日 16:34
  • 2KB
  • 下载

VB.net学习笔记(二十七)线程同步上

X夫妇二人试图同时从同一账户(总额1000)中支取1000。由于余额有1000,夫妇各自都满足条件,于是银行共支付2000。结果是银行亏了1000元。这种两个或更多线程试图在同一时刻访问同一资源来修改...

Android 线程同步Demo

  • 2017年04月17日 15:25
  • 21.48MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:线程同步
举报原因:
原因补充:

(最多只允许输入30个字)