Chinaunix首页 | 论坛 | 博客
  • 博客访问: 923690
  • 博文数量: 201
  • 博客积分: 8078
  • 博客等级: 中将
  • 技术积分: 2162
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-20 17:22
文章分类

全部博文(201)

文章存档

2013年(3)

2012年(11)

2011年(34)

2010年(25)

2009年(51)

2008年(77)

分类: WINDOWS

2011-04-18 11:33:03

其实可以通过interlocked函数来减少锁的使用的。伪代码如下

struct state_context {
    volatile LONG retry;
    volatile LONG running;
};

struct overlapped_context {
    volatile LONG finish;
    struct state_context * state; 
};

for ( ; ; ) {
    struct state_context * stp;
    struct overlapped_context * cxp;
    GetQueuedCompletionStatus(port, &count, &key, &overlapped);
    cxp = (struct overlapped_context *)overlapped; 
    stp = cxp->state;

    InterlockedExchange(&cxp->finish, 1);
    InterlockedExchange(&stp->retry, 1);

    for ( ; ; ) {

        LONG ready = InterlockedExchange(&stp->running, 1);
        if (ready != 0)
                break;

        ready = InterlockedExchange(&stp->retry, 0);
        if (ready != 0) {
            ;do something for process;
        }
        InterlockedExchange(&stp->running, 0);

        ready = InterlockedExchange(&stp->retry, 0);
        if (ready == 0)
                break;

        InterlockedExange(&stp->retry, 1);
    }
}

阅读(886) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~