在c中使用pthreads,由于某种原因,每个pthread都有一个不同的锁实例

时间:2012-10-17 04:11:58

标签: c pthreads semaphore

所以基本上我正在开发一个类项目,我们自己实现一个锁。我相当肯定我的锁码是正确的,但我的测试代码不能正常工作。我们正在使用一个名为sthreads的pthreads版本,我的教授给了这个版本。 这是我的测试代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "sync.h"
#include "sthread.h"

sthread_mutex_t *mutex;
int locktest(void* arg){
    int threadNum = (int)arg;
    //int i;
    for(;;){ 
        int x  = sthread_mutex_lock(mutex);
        printf("return value: %d\n", x);
        //sleep(1);
        printf("thread %d has the lock\n", threadNum);
        sleep(1);
        sthread_mutex_unlock(mutex);
    }
    return 0;
}


int main(){
sthread_t thr1, thr2, thr3, thr4, thr5;

if (sthread_init() == -1){
    return -1;
}

if(sthread_mutex_init(mutex)){
    return -1;
}

sthread_mutex_lock(mutex);

if (sthread_create(&thr1, locktest, (void *)1) == -1){
    return -1;
}
if (sthread_create(&thr2, locktest, (void *)2) == -1){
    return -1;
}
if (sthread_create(&thr3, locktest, (void *)3) == -1){
    return -1;
}
if (sthread_create(&thr4, locktest, (void *)4) == -1){
    return -1;
}
if (sthread_create(&thr5, locktest, (void *)5) == -1){
    return -1;
}

sleep(100);
sthread_mutex_unlock(mutex);
sthread_mutex_destroy(mutex);
return 0;

}

我已经发现,由于某些原因,即使互斥是全局的,每个线程都有不同的实例。我知道这一点,因为函数locktest(每个线程运行)中每次调用sthread_mutex_lock(mutex)的返回值不为0.这表示锁尚未初始化,因此即使你看到我初始化了一个空指针它主要在第二个if语句中。

有没有人知道为什么会发生这种情况?

1 个答案:

答案 0 :(得分:3)

您永远不会将mutex初始化为指向任何内容,因此它的值为NULLsthread_mutex_init(mutex)无效,因为它基本上传递了值NULL

可能想要sthread_mutex_init(&mutex)(将sthread_mutex_init声明为sthread_mutex_t **)。