临界区是用户态的;而信号量等是内核态的,模式切换有开销,效率低。所以想用临界区来模拟信号量,仅用于线程间的计数资源同步。不过我暂时想不到有什么应用这么需要效率,我只是好玩而已,大家看有没有错误,比如会不会死锁,计数有没有漏洞,我自己还没验证。设2个临界区,一个用来保护计数资源的可用数字,另一个用来等待和标志有效(避免空转询问)。CriticalSection csResourceCount;
CriticalSection csResourceValid;#define MAX_RESOURCES x // x是最大资源数int Count = MAX_RESOURCES; // 有效资源计数构造析构略过。线程函数{......EnterCriticalSection(&csResourceCount);
if (Count > 0) // resource valid
{
goto NO_WAIT;
}LeaveCriticalSection(&csResourceCount);// we must wait for a valid resource
EnterCriticalSection(&csResourceValid);// we wait successful and get a resource, so dec the count
EnterCriticalSection(&csResourceCount);
NO_WAIT:
Count--;
LeaveCriticalSection(&csResourceCount);AccessResource(); // here we use our resource
// below is to release resourceEnterCriticalSection(&csResourceCount);
Count++; // inc the count
if (Count > 1) // have enough resouces, no thread is waiting
{
LeaveCriticalSection(&csResourceCount);
goto NO_WAITING;
}
LeaveCriticalSection(&csResourceCount);// some threads must are waiting or would wait the resource, so
LeaveCriticalSection(&csResourceValid);NO_WAITING:
......}很乱,没整理,大家将就着看。