1.线程安全问题:
每个线程都有自己的栈,而局部变量是存储在栈中的,,这就意味着每个线程都有自己的一份“局部变量”,如果线程仅仅使用“局部变量”那么就不存在线程安全问题、
那如果多个线程共用一个全局变量呢?
2.临界区实现之线程锁:
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 %x\n", 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