
信号量(一个延续了7年的低级编程问题)
最近(2006-10-12)才意识到一个延续了7年的低级编程问题。
信号量(sempahore)天然就是用于资源计数的。当一个进程试图控制并发线程数时,
首先就该想到用semaphore。但是,我这个蠢材,在7年前写这样一个程序的时候,居
然没有想到用semaphore,完全没有想到。当时光前进了7年后,我才"突然"意识到自
己之前有多蠢。
在Unix上我用了互斥锁与条件变量:
--------------------------------------------------------------------------
Pthread_mutex_lock( &allowcreatethread_mutex );
while ( threadnum >= maxthreadnum )
{
Pthread_cond_wait( &allowcreatethread_cond, &allowcreatethread_mutex );
} /* end of while */
threadnum++;
Pthread_mutex_unlock( &allowcreatethread_mutex );
/*
* 创建线程
*/
--------------------------------------------------------------------------
Pthread_mutex_lock( &allowcreatethread_mutex );
threadnum--;
Pthread_cond_broadcast( &allowcreatethread_cond );
Pthread_mutex_unlock( &allowcreatethread_mutex );
--------------------------------------------------------------------------
在Windows上我用了临界区与手工重置事件:
--------------------------------------------------------------------------
event = CreateEvent
(
NULL,
TRUE,
TRUE,
NULL
);
if ( NULL == event )
{
... ...
}
EnterCriticalSection( &critical_section );
if ( threadnum >= maxthreadnum )
{
ResetEvent( event );
}
LeaveCriticalSection( &critical_section );
if ( WAIT_FAILED == WaitForSingleObject( event, INFINITE ) )
{
... ...
}
EnterCriticalSection( &critical_section );
threadnum++;
LeaveCriticalSection( &critical_section );
/*
* 创建线程
*/
--------------------------------------------------------------------------
EnterCriticalSection( &critical_section );
threadnum--;
SetEvent( event );
LeaveCriticalSection( &critical_section );
--------------------------------------------------------------------------
我这不是吃撑了嘛,正经搞法分别应该如下:
--------------------------------------------------------------------------
sem_init
sem_wait
sem_post
--------------------------------------------------------------------------
CreateSemaphore
WaitForSingleObject
ReleaseSemaphore
--------------------------------------------------------------------------
鬼知道当年想什么去了。由于框架代码一直延续下来,结果我写的所有需要控制并发
线程数的程序都存在这个低级编程问题。最近自己反应过来后跟hume说起这个事,才
知道他以前查看我的一份源码时注意到我没有按常规思路使用semaphore,但他也只
是奇怪了一下下,没有提醒我,可恶啊,hume现在真的越来越不可靠了!