c++实现java synchronized关键字

来源:互联网 发布:明源软件录入 编辑:程序博客网 时间:2024/06/04 18:47
// 重载对象的"+= / -="实现访问加锁,重载 "=" 实现访问解锁。从而实现互斥访问对象。


// 互斥模块类


#pragma once
#include "stdafx.h"


// 用于实现互斥的模版类
// 作者:陈 A Z
// 时间:2016/12/18


template <typename T>
class CSyncParam
{
public:
// 互斥锁
    HANDLE m_hMutex;


public:
// 数据成员
T td;


CSyncParam();
~CSyncParam();


void MakeData(T t);


// 开启对象锁
void SetLock();


// 释放对象锁
void ReleaseLock();


// 用来解锁互斥
CSyncParam<T> operator=(CSyncParam<T> & csp);


// 互斥读写成员
CSyncParam<T> operator+=(CSyncParam<T> & csp);
// 互斥读写成员
CSyncParam<T> operator-=(CSyncParam<T> & csp);
};


// 开启互斥等待
template <typename T>
void CSyncParam<T>::SetLock()
{
// 加锁
//printf("加锁地址 : %d \n", &m_hMutex);
// 开始访问要锁住
WaitForSingleObject(m_hMutex, INFINITE);
}


// 释放互斥对象
template <typename T>
void CSyncParam<T>::ReleaseLock()
{
// 解锁
//printf("释放地址 : %d \n", &m_hMutex);
ReleaseMutex(m_hMutex);
}


// 解锁访问对象
template <typename T>
CSyncParam<T> CSyncParam<T>::operator=(CSyncParam<T> & csp)
{
// 直接拷贝
memcpy(this, &csp, sizeof(CSyncParam<T>));


// 释放间接对象
csp.ReleaseLock();
// 释放间接对象
this->ReleaseLock();


return *this;
}


// 加锁读写
template <typename T>
CSyncParam<T> CSyncParam<T>::operator+=(CSyncParam<T> & csp)
{
// 加锁方可访问
csp.SetLock();
this->SetLock();


// 加锁方可访问
// 直接拷贝
memcpy(this, &csp, sizeof(CSyncParam<T>));


return *this;
}


// 加锁读写
template <typename T>
CSyncParam<T> CSyncParam<T>::operator-=(CSyncParam<T> & csp)
{
// 加锁方可访问
csp.SetLock();
this->SetLock();


// 加锁方可访问
// 直接拷贝
memcpy(this, &csp, sizeof(CSyncParam<T>));


return *this;
}


// 互斥的数据
template <typename T>
void CSyncParam<T>::MakeData(T t)
{
td = t;
}


template <typename T>
CSyncParam<T>::~CSyncParam()
{
//CloseHandle(m_hMutex);
FindClose(m_hMutex);
}


template <typename T>
CSyncParam<T>::CSyncParam()
{
m_hMutex = CreateMutex(NULL, FALSE, NULL);
}


//template <typename T>
//HANDLE CSyncParam<T>::m_hMutex;


// 主文件
// Sync.cpp : 定义控制台应用程序的入口点。
// 


#include "stdafx.h"


#include "SyncParam.h"
#include "process.h"


#include <vector>
using namespace std;


// 线程处理过程
void ThreadProc(void * pParam);


#define SYNC_PARAM_START(value_type) CSyncParam<##value_type>


#define SYNC_L CSyncParam<
#define SYNC_R  >


// 声明对象
SYNC_PARAM_START(vector<int>) cp;


//CSyncParam<vector<int>> cp;
//CSyncParam<vector<int>> * cy = new CSyncParam<vector<int>>;


int _tmain(int argc, _TCHAR* argv[])
{
// 构造数据
vector<int> vec;
for (int i = 0; i < 100; i++)
{
vec.push_back(i);
}
// 填充数据
cp.MakeData(vec);


// 开多个线程同时卖票
for (int i = 10; i >= 0; i--)
{
_beginthread(ThreadProc, NULL, NULL);
}


while (1)
{


}


Sleep(10000);
printf("准备退出!");
return 0;
}


//SYNC_PARAM_START (vector<int>) cy;


// 宏拼接对象
SYNC_L vector<int> SYNC_R cy;


void ThreadProc(void * pParam)
{
while (1)
{
// 互斥访问开始
cy -= cp;


vector<int> & vd = cy.td;


if (vd.size())
{
vd.pop_back();
}
if (vd.empty())
{
return;
}
printf(“卖票编号:%2d 线程ID:%d \n", vd.size(), GetCurrentThreadId());


// 解锁互斥结束
cp = cy;
Sleep(10);


//cy->ReleaseLock();
//cy->ReleaseLock();
}
}







0 0
原创粉丝点击