2

每个人。我是信号量的新手,最近我正在学习使用二进制信号量来实现一个简单的问题,我有一些问题。

所以有一个会客室,一次只能一个人进去。在我的设计中,有三个人队列(这是我创建的所有线程)。例如,在第二个队列中的人访问了那个房间后,下一个要进入房间的人是第三个队列中的最前面的人,而不是第一个队列的人。给出了总人数。离开后,只需简单地终止线程。

我正在尝试创建三个信号量来处理此问题,即,在第二个队列中的一个人进入后,然后阻止第二个队列并且仅“发出信号”第三个队列继续。依此类推。但是,代码存在一些问题。在这里,我只展示代码的一些信号量部分。

主要内容:

sem_init(&mutex, 0, 1);

sem_init(&s0, 0, 1);

sem_init(&s1, 0, 1);

sem_init(&s2, 0, 1);

// 创建 100 个 pthread 并随机放入 queue0 或 queue1 或 queue2

 for(int i = 0; i<num_thread; i++){ 

        pthread_t curr_thread;
        if(queueId == 0){
            queue0.push(curr_thread);           
        }else if(queueId == 1){ 
            queue1.push(curr_thread);   
        }else if(queueId == 2){ 
            queue2.push(curr_thread);   
        }
            pthread_attr_t attr;
            pthread_attr_init (&attr);
            pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
            pthread_create (&curr_thread, &attr, &thread_function, &queue_Num);
            pthread_attr_destroy (&attr);

    }

在线程函数中:

void* thread_function (void* arg){

        sem_wait(&mutex);

        int n = *((int*) arg);
        if(n==0){
            sem_wait(&s0);
            cout << "person in queue" << n << " is visiting" << endl;
            sleep(1);
            if(!queue0.empty()){
                queue0.pop();
            }else{
                n++;
            }
            sem_post(&s1);

        }else if(n==1){
            sem_wait(&s1);
            cout << "person in queue" << n << " is visiting" << endl;
            sleep(1);
            if(!queue1.empty()){
                queue1.pop();
            }else{
                n++;
            }
            sem_post(&s2);
        }else if(n==2){
            sem_wait(&s2);
            cout << "person in queue" << n << " is visiting" << endl;
            sleep(1);
            if(!queue2.empty()){
                queue2.pop();
            }else{
                n++;
            }
            sem_post(&s0);
        }

        sem_post(&mutex);

    return NULL;
}

实际上,当我运行它时,似乎遇到了“死锁”,每次只显示 2 个线程。我认为thread_function的设计一定存在一些问题。有没有人可以帮助指出并告诉我如何解决它?提前谢谢。

4

1 回答 1

0

当您将您传递queueId给线程时,您不想将指针传递给您的局部变量之一,因为您将很快改变它。相反,您应该将整数本身传递给您的线程:

pthread_create(&curr_thread, &attr, &thread_function, (void*)queueId);
                                        // Pass queueId the int, not a pointer

然后,当您需要读取线程中的值时,只需将其void*转换为整数:

void* thread_function (void* arg){
    ...

    int n = (long)arg;

    ..
}

在此之后,您的代码对我来说效果很好。

于 2012-12-06T00:25:36.623 回答