1.线程安全问题:
每个线程都有自己的栈,而局部变量是储存在栈中的,这就意味着每个线程都有一份自己的“局部变量”,如果线程仅仅使用“局部变量”那么就不存在线程安全问题。
那如果多个线程共用一个全局变量呢?
多线程不一定存在线程安全问题,多线程访问全局变量也不一定有安全问题,多线程如果对全局变量只读那也没有安全问题。
那么多线程的线程安全问题的前提是:
<1>有全局变量
<2>对全局变量不是只读,有写的动作。
我写一段代码让两个线程对全局变量同时有写的动作
#include"stdafx.h"
#include<stdio.h>
int Tickets = 10;
DWORD WINAPI ThreadProc1(_In_ LPVOID lpParameter)
{
while (Tickets > 0) //判断是否还有余票
{
printf("还有:%d张票\n", Tickets);
Tickets--; //这里就是写了
printf("卖出一张,还有:%d张\n", Tickets);
}
return 0;
}
int main(int argc, char argv[])
{
DWORD result1;
DWORD result2;
HANDLE hThread[2];
hThread[0] = CreateThread(NULL, 0, ThreadProc1, NULL, 0, NULL);//创建线程
hThread[1] = CreateThread(NULL, 0, ThreadProc1, NULL, 0, NULL);//创建线程
WaitForMultipleObjects(2, hThread, TRUE, INFINIT
Windows下的线程安全与临界区实现

本文探讨了线程安全问题,特别是在多线程访问全局变量时可能出现的问题。通过实例展示了线程安全问题的产生原因,并提出了临界区的概念作为解决方案。通过使用Windows API中的线程锁(CRITICAL_SECTION)来实现临界区,确保了在临界区内的全局变量访问是互斥的,从而解决了线程安全问题。
最低0.47元/天 解锁文章
461

被折叠的 条评论
为什么被折叠?



