zoukankan      html  css  js  c++  java
  • 临界区

    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张票
      ", g_dwTickets);
      17         g_dwTickets--;
      18         printf("卖出一张,还有:%d张票
      ", 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张票
      ", g_dwTickets);
      34         g_dwTickets--;
      35         printf("卖出一张,还有:%d张票
      ", 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
      ", 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 }
  • 相关阅读:
    Fedora 19安装Fcitx输入法并安装搜狗输入法资源包
    mac 功能修改。。。。
    Zend Studio / Ecliplse插件StartExplorer
    关于更改apache和mysql的路径的问题..
    解决fedora64下vim不能语法着色问题
    正则例一
    PHP中使用正则表达式详解 preg_match() preg_replace() preg_mat
    C语言正则表达式详解 regcomp() regexec() regfree()详解
    正则19-20
    正则表达式教程:30分钟让你精通正则表达式语法
  • 原文地址:https://www.cnblogs.com/hanhandaren/p/11139473.html
Copyright © 2011-2022 走看看