【发布时间】:2011-10-07 12:18:04
【问题描述】:
/*language C code*/
#include "windows.h"
typedef struct object_s
{
SRWLOCK lock;
int data;
} object_t, *object_p; /*own and pointer type*/
void thread(object_p x)
{
AcquireSRWLockExclusive(&x->lock);
//...do something that could probably change x->data value to 0
if(x->data==0)
free(x);
else
ReleaseSRWLockExclusive(&x->lock);
}
void main()
{
int i;
object_p object=(object_p)malloc(sizeof(object_t));
InitializeSRWLock(&object->lock);
for(i=0;i<3;i++)
CreateThread(0,0,thread,object,0);
}
正如您在上面的代码中所知道的,我必须完成的是让一个线程有条件地释放其他两个可能阻塞的对象。上面的代码显然是有缺陷的,因为如果对象与锁一起被释放,所有阻塞线程只会给我们错误。
下面的解决方案
/*language C code*/
#include "windows.h"
typedef struct object_s
{
/*change: move lock to stack in main()*/
int data;
} object_t, *object_p; /*own and pointer type*/
void thread(void * x)
{
struct {
PSRWLOCK l;
object_p o;
} * _x=x;
AcquireSRWLockExclusive(_x->l);
//...do something that could probably change x->data value to 0
if(_x->o->data==0)
free(_x->o);
ReleaseSRWLockExclusive(&x->lock);
}
void main()
{
int i;
SRWLOCK lock; /*lock over here*/
object_p object=(object_p)malloc(sizeof(object_t));
InitializeSRWLock(&lock);
/*pack for thread context*/
struct
{
PSRWLOCK l;
object_p o;
} context={&lock, object};
for(i=0;i<3;i++)
CreateThread(0,0,thread,&context,0);
}
在这种情况下有效,但在我的最终项目中不适用,因为实际上有一个动态的对象链接列表。通过应用这个解决方案,这意味着必须有一个相应的锁列表,每个锁对应一个对象,此外,当某个对象被释放时,它的锁必须同时被释放。与第一个代码部分相比,没有什么新东西。
现在我想知道是否有替代解决方案。非常感谢!
【问题讨论】:
标签: c windows multithreading winapi asynchronous