急救:pthread多线程问题。
我有一个线程池, 通过信号来唤醒指定的线程开始工作, 但我发现经常有频率的pthread_cond_signal( &cond );会不能及时的唤醒一个线程, 而导致闲置线程进入繁忙状态后却没有醒过来工作, 导致了大量的繁忙线程增加, 直接导致线程池效率降低。
void addTask(): 添加一个任务后大概是这样的
TPThread* tptd = ***
printf( "sendCondSignal-start.%u\n", tptd->getID() );
tptd->sendCondSignal() //pthread_cond_signal( &cond );
printf( "sendCondSignal-end.%u\n", tptd->getID() );
static thread_function(arg): 线程函数大概这样
TPThread* tptd = arg;
while(1)
{
pthread_cond_wait( &tptd->cond, &tptd->mutex );
printf( "onWaitCondSignal.%u\n", pthread_self() );
处理任务....
}
调试信息:
正常情况下是这样的
sendCondSignal-start.3065138064
onWaitCondSignal.3065138064
sendCondSignal-end.3065138064
>>-------->currFree:31, currThreadCount:32, busy:[1]
sendCondSignal-start.2991709072
onWaitCondSignal.2991709072
sendCondSignal-end.2991709072
>>-------->currFree:31, currThreadCount:32, busy:[1]
sendCondSignal-start.3054648208
onWaitCondSignal.3054648208
sendCondSignal-end.3054648208
>>-------->currFree:31, currThreadCount:32, busy:[1]
sendCondSignal-start.3002198928
onWaitCondSignal.3002198928
sendCondSignal-end.3002198928
>>-------->currFree:31, currThreadCount:32, busy:[1]
但有时候 大概几百次出现一段:
sendCondSignal-start.2886810512
onWaitCondSignal.2886810512
sendCondSignal-end.2886810512
>>-------->currFree:31, currThreadCount:32, busy:[1]
sendCondSignal-start.2750442384
onWaitCondSignal.2750442384
sendCondSignal-end.2750442384
>>-------->currFree:30, currThreadCount:32, busy:[2]
sendCondSignal-start.2865830800
sendCondSignal-end.2865830800
>>-------->currFree:29, currThreadCount:32, busy:[3]
sendCondSignal-start.3086117776
sendCondSignal-end.3086117776
>>-------->currFree:28, currThreadCount:32, busy:[4]
sendCondSignal-start.2960239504
sendCondSignal-end.2960239504
>>-------->currFree:27, currThreadCount:32, busy:[5]
sendCondSignal-start.2897300368
sendCondSignal-end.2897300368
>>-------->currFree:26, currThreadCount:32, busy:[6]
sendCondSignal-start.2813381520
sendCondSignal-end.2813381520
>>-------->currFree:25, currThreadCount:32, busy:[7]
sendCondSignal-start.2802891664
sendCondSignal-end.2802891664
>>-------->currFree:24, currThreadCount:32, busy:[8]
sendCondSignal-start.2855340944
sendCondSignal-end.2855340944
>>-------->currFree:23, currThreadCount:32, busy:[9]
sendCondSignal-start.3033668496
sendCondSignal-end.3033668496
>>-------->currFree:22, currThreadCount:32, busy:[10]
sendCondSignal-start.3065138064
sendCondSignal-end.3065138064
>>-------->currFree:21, currThreadCount:32, busy:[11]
sendCondSignal-start.2991709072
sendCondSignal-end.2991709072
>>-------->currFree:20, currThreadCount:32, busy:[12]
sendCondSignal-start.3054648208
sendCondSignal-end.3054648208
>>-------->currFree:19, currThreadCount:32, busy:[13]
sendCondSignal-start.3002198928
sendCondSignal-end.3002198928
>>-------->currFree:18, currThreadCount:32, busy:[14]
sendCondSignal-start.2792401808
sendCondSignal-end.2792401808
>>-------->currFree:17, currThreadCount:32, busy:[15]
sendCondSignal-start.2771422096
sendCondSignal-end.2771422096
>>-------->currFree:16, currThreadCount:32, busy:[16]
sendCondSignal-start.3023178640
sendCondSignal-end.3023178640
>>-------->currFree:15, currThreadCount:32, busy:[17]
sendCondSignal-start.3044158352
sendCondSignal-end.3044158352
>>-------->currFree:14, currThreadCount:32, busy:[18]
sendCondSignal-start.2949749648
sendCondSignal-end.2949749648
>>-------->currFree:13, currThreadCount:32, busy:[19]
sendCondSignal-start.2781911952
sendCondSignal-end.2781911952
>>-------->currFree:12, currThreadCount:32, busy:[20]
sendCondSignal-start.2844851088
sendCondSignal-end.2844851088
>>-------->currFree:11, currThreadCount:32, busy:[21]
sendCondSignal-start.2760932240
sendCondSignal-end.2760932240
>>-------->currFree:10, currThreadCount:32, busy:[22]
sendCondSignal-start.2981219216
sendCondSignal-end.2981219216
>>-------->currFree:9, currThreadCount:32, busy:[23]
sendCondSignal-start.2834361232
sendCondSignal-end.2834361232
>>-------->currFree:8, currThreadCount:32, busy:[24]
sendCondSignal-start.2928769936
sendCondSignal-end.2928769936
>>-------->currFree:7, currThreadCount:32, busy:[25]
sendCondSignal-start.2823871376
sendCondSignal-end.2823871376
>>-------->currFree:6, currThreadCount:32, busy:[26]
sendCondSignal-start.2876320656
sendCondSignal-end.2876320656
>>-------->currFree:5, currThreadCount:32, busy:[27]
sendCondSignal-start.3012688784
sendCondSignal-end.3012688784
>>-------->currFree:4, currThreadCount:32, busy:[28]
sendCondSignal-start.3075627920
sendCondSignal-end.3075627920
>>-------->currFree:3, currThreadCount:32, busy:[29]
sendCondSignal-start.2970729360
sendCondSignal-end.2970729360
>>-------->currFree:2, currThreadCount:32, busy:[30]
sendCondSignal-start.2939259792
sendCondSignal-end.2939259792
>>-------->currFree:1, currThreadCount:32, busy:[31]
sendCondSignal-start.2886810512
sendCondSignal-end.2886810512
>>-------->currFree:0, currThreadCount:32, busy:[32]
>>save BusyTask to list!
>>save BusyTask to list!
>>save BusyTask to list!
>>save BusyTask to list!
>>save BusyTask to list!
>>save BusyTask to list!
>>save BusyTask to list!
>>save BusyTask to list!
>>save BusyTask to list!
>>save BusyTask to list!
>>save BusyTask to list!
>>save BusyTask to list!
onWaitCondSignal.2865830800
onWaitCondSignal.3086117776
onWaitCondSignal.2960239504
onWaitCondSignal.2897300368
onWaitCondSignal.2813381520
onWaitCondSignal.2802891664
onWaitCondSignal.2855340944
onWaitCondSignal.3033668496
onWaitCondSignal.3065138064
onWaitCondSignal.2991709072
onWaitCondSignal.3054648208
onWaitCondSignal.3002198928
onWaitCondSignal.2792401808
onWaitCondSignal.2771422096
onWaitCondSignal.3023178640
onWaitCondSignal.3044158352
onWaitCondSignal.2949749648
onWaitCondSignal.2781911952
onWaitCondSignal.2844851088
onWaitCondSignal.2760932240
onWaitCondSignal.2981219216
onWaitCondSignal.2834361232
onWaitCondSignal.2928769936
onWaitCondSignal.2823871376
onWaitCondSignal.2876320656
onWaitCondSignal.3012688784
onWaitCondSignal.3075627920
onWaitCondSignal.2970729360
onWaitCondSignal.2939259792
onWaitCondSignal.2886810512
发送信号那里像阻塞了一样 之后一起爆发...
class TPThread
{
protected:
pthread_cond_t cond; // 线程信号量
pthread_mutex_t mutex; // 线程互诉体
static thread_function()...
virtual void initCond( void )
{
pthread_cond_init( &cond, NULL );
}