笛里谁知壮士心,沙头空照征人骨。这篇文章主要讲述线程安全相关的知识,希望能为你提供帮助。
什么是线程安全简单的说就是一个全局变量,当多个线程同时操作它的时候不会出现意外情况,相反如果出现了意外就说明是非线程安全的。
下面是个 非线程安全 的例子:
// 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
所以这些代码是 非线程安全 的。
【线程安全】
推荐阅读
- Scala 基础 (变量和数据类型)
- CookieSessionToken 的区别
- MyBatis从入门到精通—源码剖析之二级缓存细节
- Scala 基础 (运算符和流程控制)
- 远程call调用
- 一次诡异的磁盘空间占用问题排查
- Java中的类和对象
- C++ 遍历进程内存块
- 通过注册表强制解锁文件占用