概述
1.线程安全问题:
每个线程都有自己的栈,而局部变量是存储在栈中的,,这就意味着每个线程都有自己的一份“局部变量”,如果线程仅仅使用“局部变量”那么就不存在线程安全问题、
那如果多个线程共用一个全局变量呢?
2.临界区实现之线程锁:
- 创建全局变量:CRITICAL_SECTION cs;
- 初始化全局变量:InitializeCriticalSection (&cs);
- 实现临界区
- EnterCriticalSection(&cs)//使用临界区资源
- LeaveCriticalSection(&cs);
-
1 // 临界区.cpp : 定义控制台应用程序的入口点。 2 // 3 4 5 #include "stdafx.h" 6 #include <windows.h> 7 8 CRITICAL_SECTION cs; //创建令牌 9 int g_dwTickets = 10; 10 DWORD WINAPI ThreadProc(LPVOID lpParameter) 11 { 12 EnterCriticalSection(&cs); 13 while (g_dwTickets > 0) 14 { 15 16 printf("还有:%d张票n", g_dwTickets); 17 g_dwTickets--; 18 printf("卖出一张,还有:%d张票n", g_dwTickets); 19 20 } 21 LeaveCriticalSection(&cs);//离开临界区 22 return 0; 23 } 24 25 DWORD WINAPI ThreadProc2(LPVOID lpParameter) 26 { 27 28 29 EnterCriticalSection(&cs); 30 while (g_dwTickets > 0) 31 { 32 33 printf("还有:%d张票n", g_dwTickets); 34 g_dwTickets--; 35 printf("卖出一张,还有:%d张票n", g_dwTickets); 36 37 } 38 LeaveCriticalSection(&cs);//离开临界区 39 return 1; 40 } 41 int main() 42 { 43 HANDLE hThreadArr[2]; 44 DWORD dwResult1; 45 DWORD dwResult2; 46 47 InitializeCriticalSection(&cs);//初始化 48 49 hThreadArr[0] = CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL); //线程传递参数直接传递地址就行了,可以传任何类型的指针,结构体等等; 50 hThreadArr[1] = CreateThread(NULL, 0, ThreadProc2, NULL, 0, NULL); 51 52 SuspendThread(hThreadArr[0]);//获取线程上下文一定要先把线程挂起 53 54 CONTEXT context; //设置一个CONTEXT结构体 55 context.ContextFlags = CONTEXT_INTEGER; //ContextFlags需要哪些寄存器就直接填写哪些 56 GetThreadContext(hThreadArr[0], &context); 57 printf("%x %xn", context.Eax, context.Ebp); 58 ResumeThread(hThreadArr[0]); 59 60 getchar(); 61 CloseHandle(hThreadArr[0]); 62 CloseHandle(hThreadArr[1]); 63 64 65 66 return 0; 67 }
转载于:https://www.cnblogs.com/hanhandaren/p/11139473.html
最后
以上就是正直花瓣为你收集整理的临界区的全部内容,希望文章能够帮你解决临界区所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复