pthreads:不同线程数的不同行为

时间:2011-02-15 19:15:05

标签: linux multithreading pthreads

所以,我有一个代码(类似线程池)创建很少的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

1 个答案:

答案 0 :(得分:1)

我抓到了这个bug!我忘了初始化数组 threads ,这是我班级的一个字段。 ephemient 是正确的,它是内存腐败。