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

本文介绍了如何在C++中使用临界段实现线程间的同步,并通过实例展示了如何在不同工程间共享资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值