线程安全

笛里谁知壮士心,沙头空照征人骨。这篇文章主要讲述线程安全相关的知识,希望能为你提供帮助。
什么是线程安全简单的说就是一个全局变量,当多个线程同时操作它的时候不会出现意外情况,相反如果出现了意外就说明是非线程安全的。
下面是个 非线程安全 的例子:

// Test_Console.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include < iostream>
#include < Windows.h>
#include < iomanip>
#include < fstream>
#include< cstdlib>
#include< string>

using namespace std;

int num = 0;

typedef struct MyData

int n; // 线程代号

MYDATA;

void myThread(LPVOID lpParam)
MYDATA *pmd = (MYDATA *)lpParam;
while(1)
num++;
printf("[%d]:%d\\n",pmd-> n,num);

Sleep(100);



int _tmain(int argc, _TCHAR* argv[])

MYDATA md1,md2,md3;
md1.n = 1; md2.n = 2; md3.n = 3;
CreateThread(0,0,(LPTHREAD_START_ROUTINE)myThread,& md1,0,0);
CreateThread(0,0,(LPTHREAD_START_ROUTINE)myThread,& md2,0,0);
CreateThread(0,0,(LPTHREAD_START_ROUTINE)myThread,& md3,0,0);

getchar();
return 0;

效果图:


可以发现数据变乱了,罪魁祸首其实是 ??num++; ??? 这一行代码,因为它的执行过程分为几步:
(1)获取 num 的值
(2)计算 num + 1 的值
(3)将计算的值赋给 num
但如果是多个线程,按照如下顺序执行:
1.首先线程1执行将 num 赋值为 4
2.线程2获取num = 4,并执行 num++,使得num=5,但此时线程2还没有执行到 printf
3.线程3获取num=5,执行num++=6,输出 [3]:6
4.线程2输出 [2]:5
就导致了以上情况的发生。
所以这些代码是 非线程安全 的。


【线程安全】


    推荐阅读