VC++ 线程同步 CRITICAL_SECTION

声明:本人一个菜鸟,网上搜罗了很多关于VC++编程的资料,可每本资料都是涵盖面太广,难以细致。英语又太烂,所以不得意只得摸索,恐又忘记所以记在此处,若有不对的地方,烦劳指出,不胜感激。

author:[email protected]

license:GPL

IDE:Visual Studio 2008


临界区,主要函数

CRITICAL_SECTION g_csLock;           //定义
InitializeCriticalSection(&g_csLock);   // 初始化
EnterCriticalSection(&g_csLock);       //进入
LeaveCriticalSection(&g_csLock);      //离开  
DeleteCriticalSection(&g_csLock);     //销毁

实例

#include "stdafx.h"
#include <Windows.h>
#include <process.h>  //_beginthreadex
#include <iostream>

int g_candy = 0;
CRITICAL_SECTION g_csLock;
unsigned int _stdcall thread_bob(void *);  //_beginthreadex P3

int _tmain(int argc, _TCHAR* argv[])
{
    // this is Alice
    InitializeCriticalSection(&g_csLock);
    unsigned threadID;
    //创建线程
    _beginthreadex(NULL,0,thread_bob,NULL,0,&threadID);

    while(1)
    {
        EnterCriticalSection(&g_csLock);  // 进入临界区
        /* 注意,加上下面这句话,不会对Alice线程产生影响,但是Bob线程走不动了 */
        //EnterCriticalSection(&g_csLock);
        std::cerr <<"Alice: "<<g_candy++ <<std::endl;
        Sleep(3000);

        /* 如果上面两个 EnterCriticalSection,下面两个LeaveCriticalSection,则两个线程都可以跑起来*/
        LeaveCriticalSection(&g_csLock);  //离开临街区
        //LeaveCriticalSection(&g_csLock);
    }
	return 0;
}

unsigned int _stdcall thread_bob(void*)
{
    // this is Bob
    while (1)
    {
        EnterCriticalSection(&g_csLock);
        std::cerr <<"Bob: " << g_candy++ <<std::endl;
        LeaveCriticalSection(&g_csLock);
        Sleep(1000);
    }
}

貌似,在一个线程内,同一个临界区可以重复进入,而不会对这个线程产生什么影响,但另一个线程就惨了,它根本得不到锁。Alice线程进两次临界区,出一次,对Bob来说相当于Alice还在临界区里。

你可能感兴趣的:(thread,编程,null,vc++)