标题: 信号量(一个延续了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现在真的越来越不可靠了!