所以,我有一个代码(类似线程池)创建很少的pthreads 它们首先在互斥锁上被阻塞(所有未创建的线程)然后等待条件变量,直到主线程向它们广播通知。
我在两台PC上测试了这段代码:第一 - 带有2核AMD的gentoo x64,第二 - 带有p4(HT打开)的mandriva x32。我得到了不同的结果。
适用于第一个PC,池中有2个线程,第二个,池中有3个线程。
但是!
线程数大于2的第一 PC:在解锁互斥锁(之前锁定)时从主线程抛出错误EPERM。
线程数超过3的第二 PC:在解锁互斥锁(之前锁定)以及从创建的线程中对所有顺序调用mutex和cond时,从主线程抛出错误EINVAL。
任何想法? :)
P.S。使用NULL attrs创建的线程mutex和cond
主要():
...
pthread_mutex_init(&mutex, NULL);
pthread_cond_init(&queue_condition, NULL);
running = true;
lock();
while(pool_size<limit) {
pthread_create(&threads[pool_size++], NULL, &run, this)
}
unlock();
sleep(2);
schedule(new SimpleJob(...));
sleep(2);
...
运行():
while (running) {
lock();
Job* job = next();
if (job == NULL) {
wait();
unlock();
continue;
}
unlock();
job->execute();
delete job;
}
子程序:
void lock() {
pthread_mutex_lock(&mutex);
}
void unlock() {
pthread_mutex_unlock(&mutex);
}
void wait() {
pthread_cond_wait(&queue_condition, &mutex);
}
void notifyAll() {
pthread_cond_broadcast(&queue_condition);
}
void schedule(Job* job) {
lock();
job_queue.push(job);
notifyAll();
unlock();
}
Job* next() {
if (job_queue.empty()) {
return NULL;
}
Job* job = job_queue.front();
job_queue.pop();
return job;
}
在具有4个线程的第二台PC上输出:
3076544208] hi! Im main thread! 3076544208] starting all threads 3076544208] locking... 3076544208] locked 3076544208] init: 3076544208] thread[1] = 3076541296 created 3076544208] thread[2] = 3068148592 created 3076544208] thread[3] = 3059755888 created 3076544208] thread[4] = 3051363184 created 3076544208] init done. 3076544208] unlocking... 3076544208] unlocked error=22 3051363184] run 3051363184] locking... 3051363184] locked error=22
答案 0 :(得分:1)
我抓到了这个bug!我忘了初始化数组 threads
,这是我班级的一个字段。 ephemient 是正确的,它是内存腐败。