VC++ 线程同步 CRITICAL_SECTION

来源:互联网 发布:mysql远程客户端中文版 编辑:程序博客网 时间:2024/06/09 21:12

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

author:fym0121@163.com

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 P3int _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还在临界区里。