多线程的那点儿事(之多线程数据结构)
2014-04-11 17:42
441 查看
说明:本文转自http://blog.csdn.net/feixiaoxing/article/details/7058393
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
要想编写多线程,那就要使用锁。而在软件编写中,数据结构是少不了的。所以,我们在编写多线程的时候,就需要考虑一下如何在数据结构中插入锁。当然,有些数据结构是没有锁的,所以自然这个锁并不一定是必须的。
比如说,我们编写一个多线程堆栈,应该怎么做呢,
[cpp] view
plaincopy
typedef struct _STACK
{
void* pData;
int maxLen;
int top;
void* hLock;
STATUS (*push)(struct _STACK* pStack, void* pData, int size);
STATUS (*pop)(struct _STACK* pStack, void* pData, int size);
}STACK;
(1) 初始化操作
[cpp] view
plaincopy
STACK* get_new_stack(void* pData, int len, void* pLock)
{
STACK* pStack;
if(NULL == pData || 0 == len)
return NULL;
pStack = (STACK*)malloc(sizeof(STACK));
assert(NULL != pStack);
memset(pStack, 0, sizeof(STACK));
pStack->pData = pData;
pStack->maxLen = len;
if(NULL != pLock)
pStack->hLock = pLock;
return pStack;
}
(2) 添加数据
[cpp] view
plaincopy
STATUS push(struct _STACK* pStack, void* pData, int size)
{
assert(NULL != pStack && NULL != pData);
if(NULL != pStack->hLock)
WaitForSingleObject((HANDLE)pStack->hLock, INFINITE);
if(pStack->top == pStack->maxLen){
if(NULL != pStack->hLock)
ReleaseMutex((HANDLE)pStack->hLock);
return ERROR;
}
memmove((char*)pStack->pData + size * pStack->top, (char*)pData, size);
pStack->top ++;
if(NULL != pStack->hLock)
ReleaseMutex((HANDLE)pStack->hLock);
return OK;
}
(3) 对2进行优化,因为判断的条件比较复杂
[cpp] view
plaincopy
#define STACK_CHECK_LOCK(hLock) \
do{\
if(hLock)\
WaitForSingleObject((HANDLE)hLock, INFINITE);\
}while(0)
#define STACK_CHECK_UNLOCK(hLock) \
do{\
if(hLock)\
ReleaseMutex((HANDLE)hLock);\
}while(0)
所以,2的代码可以修改为,
[cpp] view
plaincopy
STATUS push(struct _STACK* pStack, void* pData, int size)
{
assert(NULL != pStack && NULL != pData);
STACK_CHECK_LOCK(pStack->hLock);
if(pStack->top == pStack->maxLen){
STACK_CHECK_UNLOCK(pStack->hLock);
return ERROR;
}
memmove((char*)pStack->pData + size * pStack->top, (char*)pData, size);
pStack->top ++;
STACK_CHECK_UNLOCK(pStack->hLock);
return OK;
}
总结:
(1) 一般来说,比较好的数据结构要兼有多线程和没有多线程两种情况
(2) 如果需要用其他的锁代替mutex,直接换掉就可以,十分方便
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
要想编写多线程,那就要使用锁。而在软件编写中,数据结构是少不了的。所以,我们在编写多线程的时候,就需要考虑一下如何在数据结构中插入锁。当然,有些数据结构是没有锁的,所以自然这个锁并不一定是必须的。
比如说,我们编写一个多线程堆栈,应该怎么做呢,
[cpp] view
plaincopy
typedef struct _STACK
{
void* pData;
int maxLen;
int top;
void* hLock;
STATUS (*push)(struct _STACK* pStack, void* pData, int size);
STATUS (*pop)(struct _STACK* pStack, void* pData, int size);
}STACK;
(1) 初始化操作
[cpp] view
plaincopy
STACK* get_new_stack(void* pData, int len, void* pLock)
{
STACK* pStack;
if(NULL == pData || 0 == len)
return NULL;
pStack = (STACK*)malloc(sizeof(STACK));
assert(NULL != pStack);
memset(pStack, 0, sizeof(STACK));
pStack->pData = pData;
pStack->maxLen = len;
if(NULL != pLock)
pStack->hLock = pLock;
return pStack;
}
(2) 添加数据
[cpp] view
plaincopy
STATUS push(struct _STACK* pStack, void* pData, int size)
{
assert(NULL != pStack && NULL != pData);
if(NULL != pStack->hLock)
WaitForSingleObject((HANDLE)pStack->hLock, INFINITE);
if(pStack->top == pStack->maxLen){
if(NULL != pStack->hLock)
ReleaseMutex((HANDLE)pStack->hLock);
return ERROR;
}
memmove((char*)pStack->pData + size * pStack->top, (char*)pData, size);
pStack->top ++;
if(NULL != pStack->hLock)
ReleaseMutex((HANDLE)pStack->hLock);
return OK;
}
(3) 对2进行优化,因为判断的条件比较复杂
[cpp] view
plaincopy
#define STACK_CHECK_LOCK(hLock) \
do{\
if(hLock)\
WaitForSingleObject((HANDLE)hLock, INFINITE);\
}while(0)
#define STACK_CHECK_UNLOCK(hLock) \
do{\
if(hLock)\
ReleaseMutex((HANDLE)hLock);\
}while(0)
所以,2的代码可以修改为,
[cpp] view
plaincopy
STATUS push(struct _STACK* pStack, void* pData, int size)
{
assert(NULL != pStack && NULL != pData);
STACK_CHECK_LOCK(pStack->hLock);
if(pStack->top == pStack->maxLen){
STACK_CHECK_UNLOCK(pStack->hLock);
return ERROR;
}
memmove((char*)pStack->pData + size * pStack->top, (char*)pData, size);
pStack->top ++;
STACK_CHECK_UNLOCK(pStack->hLock);
return OK;
}
总结:
(1) 一般来说,比较好的数据结构要兼有多线程和没有多线程两种情况
(2) 如果需要用其他的锁代替mutex,直接换掉就可以,十分方便
相关文章推荐
- 多线程的那点儿事(之多线程数据结构)
- 多线程的那点儿事17(之多线程数据结构)(转)
- 借用一个程序 来说明 多线程 和单态 以及 对象在两种情况下的存储方式。
- GDB 多线程调试
- java多线程 sleep()和wait()的区别
- 多线程的分离思考
- Libevent源码分析-----多线程、锁、条件变量(一)
- 黑马程序员_日记18_Java多线程(八)--生产者消费者问题JDK1.5特性
- ios多线程简单整理
- Java基础知识强化之多线程笔记05:Java中继承thread类 与 实现Runnable接口的区别
- java多线程一些知识
- Android暑期实习面试漏洞之Java多线程
- Python多线程小例子
- 多线程实例,6位随机数
- 在C#中编写多线程应用程序
- 支持多线程的DRB server
- 多线程死锁代码实例
- java多线程
- MFC用户界面多线程实例2
- linux下C/C++,多线程pthread《转载》