临界区

1.线程安全问题:

  每个线程都有自己的栈,而局部变量是存储在栈中的,,这就意味着每个线程都有自己的一份“局部变量”,如果线程仅仅使用“局部变量”那么就不存在线程安全问题、

  那如果多个线程共用一个全局变量呢?


2.临界区实现之线程锁:

  1. 创建全局变量:CRITICAL_SECTION cs;
  2. 初始化全局变量:InitializeCriticalSection (&cs);
  3. 实现临界区    
    1. EnterCriticalSection(&cs)//使用临界区资源
    2. 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 %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 }

     

 

posted @ 2019-07-05 17:05  瀚瀚大人  阅读(557)  评论(0编辑  收藏  举报