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();
}
}
// 互斥模块类
#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
- c++实现java synchronized关键字
- java同步关键字Synchronized 的实现原理
- java中synchronized关键字的实现
- synchronized关键字实现同步
- Java中的synchronized关键字
- java的synchronized关键字
- java中的synchronized关键字
- java中的synchronized关键字
- java中的synchronized关键字
- Java中的synchronized关键字
- Java synchronized关键字
- java中的synchronized关键字
- java synchronized关键字
- java synchronized 关键字
- Java的关键字synchronized
- java关键字synchronized
- java synchronized关键字理解
- Java中的synchronized关键字
- Java之——基本数据类型与byte数组相互转化
- android 添加触摸反馈
- Linux下简写汇集
- struts2取得request,session,appilcation的方法
- IOS学习(二十一)block简单使用
- c++实现java synchronized关键字
- redhat 5.1安装gcc操作步骤
- Bootstrap学习---css
- [FUNC]测试是否联网
- 教女友学编程-2-先学爬虫
- 【易语言界面开发系列教程之(EX_UI使用系列教程--EX组件(一键换肤))】
- 1222
- 236. Lowest Common Ancestor of a Binary Tree**
- Opencv 编译静态库