首先添加一个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;
}