visual studio2008在同一个解决方案下,多个工程共享一个临界段的实现方法(预编译指令ifdef和宏定义配合使用)

首先添加一个Global工程(工程属性生成的配置属性改为.lib)

Global.h:

#include <windows.h>
#include <process.h>
#include <iostream>

using namespace std;

#ifdef LOCAL_VAL
#define EXTERN_M
#else
#define EXTERN_M extern
#endif

EXTERN_M CRITICAL_SECTION cs;

//extern CRITICAL_SECTION cs;

Global.cpp:

#define LOCAL_VAL  //注意这里顺序不可颠倒,否则编译器编译会报错,有编译顺序的问题
#include "global.h"

添加一个Test工程(工程属性生成的配置属性改为.lib)

test.h:

#include "../Global/global.h"

unsigned long _stdcall MyThread(LPVOID pParam);

test.cpp:

#include "test.h"

unsigned long _stdcall MyThread(LPVOID pParam)
{
 EnterCriticalSection(&cs);
 cout << "I'm The 1st Thread!" << endl;
 Sleep(6000);
 LeaveCriticalSection(&cs);

 return 0;
}

添加一个Test2工程(工程属性生成的配置属性改为.lib)

Test2.h:

#include "../Global/global.h"

unsigned long _stdcall MyThread2(LPVOID pParam);

Test2.cpp:

#include "test2.h"

unsigned long _stdcall MyThread2(LPVOID pParam)
{
 EnterCriticalSection(&cs); 
 cout << "I'm The 2rd Thread!" << endl;
 LeaveCriticalSection(&cs);

 return 0;
}

添加main工程(工程属性生成的配置属性改为.exe,工程依赖设置为依赖于Global、Test和Test2三个工程)

main.h:

#include "../Test_Project/test.h"
#include "../Test_Project2/test2.h"
#include "../Global/global.h"

main.cpp:

#include "main.h"
//using namespace ss;
extern int a;
//通过在程序运行时候查看进行发现只有一个main.exe进程在运行,说明这个解决方案
//中的各个函数是在同一个进程中运行的,所以可以使用临界段进行线程直接的同步
int main()
{
 HANDLE handle1;
 HANDLE handle2;
 DWORD dw1;
 DWORD dw2;

 InitializeCriticalSection(&cs);
 
 handle2 = CreateThread(NULL,0,MyThread2,NULL,0,&dw2);
 handle1 = CreateThread(NULL,0,MyThread,NULL,0,&dw1);
 
 Sleep(10000);

 return 0;
}

 

 

 

你可能感兴趣的:(thread,null,编译器)