标题:多线程安全


所谓线程,即进程中执行运算的最小单位,亦即执行处理机调度的基本单位。如果把进程理解为在逻辑上操作系统所完成的任务,那么线程表示完成该任务的许多可能的子任务之一。线程可以在处理器上独立调度执行,这样,在多处理器环境下就允许几个线程各自在单独处理器上进行。操作系统提供线程就是为了方便而有效地实现这种并发性,线程带来的好处包括:

         1)易于调度。线程是系统调度的基本单位,线程的切换比进程要快。

         2)提高并发性。通过线程可方便有效地实现并发性。进程可创建多个线程来执行同一程序的不同部分。

         3)开销少。创建线程比创建进程要快,所需开销很少。仅占有少量的资源如堆栈和寄存器。

         4)利于充分发挥多处理器的功能。通过创建多线程进程(即一个进程可具有两个或更多个线程),每个线程在一个处理器上运行,从而实现应用程序的并发性,使每个处理器都得到充分运行。

    那么在引入了线程的系统中,进程和线程的关系是什么样的呢?

         1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。

         2)进程是拥有资源的基本单位,同一进程的所有线程共享该进程的所有资源。

         3)线程拥有CPU,即在CPU上运行的是线程。

         4)线程在运行过程中,需要同步与互斥。不同进程的线程间要利用进程通信的办法实现同步。

         线程作为进程内的一个执行单元,也是进程内的可调度实体。那么它与进程的区别包含哪些呢?

         1)调度与资源分配:线程是系统调度的基本单位,进程是拥有资源的基本单位。线程除了拥有部分寄存器和栈外,不拥有系统资源,但可以访问隶属于进程的资源,比如内存。

         2)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。

 

         在系统中,一个程序至少有一个进程,一个进程至少有一个线程。

         在实际开发应用中,无论是在Windows还是在Linux/UNIX平台上,多线程编程都包含三个组成部分:一是线程执行函数;二是线程创建函数;三是线程数据同步机制。其中,线程执行函数就是在新的线程中要执行的代码,需要通过编程去实现,把要在新的线程中完成的任务放在该执行函数中去完成;创建线程函数负责新的线程的创建,它需要线程执行函数做为参数之一,再加上线程执行函数自己的参数也做为参数之一(如果线程执行函数自己存在参数的话);线程数据同步机制则负责多线程执行环境条件下数据的完整性和一致性。


代码的多线程安全:

怎么判断代码是多线程安全的呢?首先,如果代码里只使用了局部变量,那么就一定是多线程安全的,因为局部变量,顾名思义,其它线程是不能访问和修改的;而如果使用了全局变量或者资源,那么就一定要通过系统提供的多种互斥机制来保证对全局变量或者资源进行串行访问,那么也是多线程安全的,否则,多个线程将会对该全局资源进行随机修改,造成结果不可确定,违背了程序的一致性原则。

Windows中有四种线程同步互斥机制:

1)临界区(critical_section):通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问;

2)互斥量(mutex):为协调共同对一个共享资源的单独访问而设计的;

3)信号量(semaphore):为控制一个具有有限数量用户资源而设计;

4)事件(event):用来通知线程有一些事件已发生,从而启动后继任务的开始。

5)原子操作

 

思考题:

定义了一个全局变量:int g_iTotal = 0;下面的代码是多线程安全的吗?

g_iTotal++;




看文字不过瘾?点击我,进入腾讯课堂视频教学
麦洛科菲长期致力于IT安全技术的推广与普及,我们更专业!我们的学员已经广泛就职于BAT360等各大IT互联网公司。详情请参考我们的 业界反馈 《周哥教IT.C语言深学活用》视频

我们的微信公众号,敬请关注