信号量锁定未正确锁定

问题描述 投票:0回答:1

我尝试这样做。我创建了两个线程thread1和thread2。 thread1执行write_ticket函数,使得ticketnumber=5000;然后它会休眠一秒钟然后打印它。 Ticketnumber 的访问是一个关键部分,因此它已被 sem 锁定。 在 TicketIncrease 中,它将票证增加 1 并打印。当它访问临界区时,它也被 sem 锁定。 这是我的代码。


#include <stdio.h>
#include <semaphore.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
int ticketnumber=0;
sem_t sem;
void write_ticket(){
    sem_wait(&sem);
    ticketnumber=5000;
    sleep(1);
    printf("%d\n",ticketnumber);
    sem_post(&sem);
}
void ticketIncrease(){
    sem_wait(&sem);
    ticketnumber+=1;
    printf("%d\n",ticketnumber);
    sem_post(&sem);
}
int main(){
    sem_init(&sem, 0, 1);
    pthread_t thread1;
    pthread_t thread2;
    pthread_create(&thread1,NULL,(void *)write_ticket,NULL);
    pthread_create(&thread2,NULL,(void *)ticketIncrease,NULL);
    pthread_join(thread1,NULL);
    pthread_join(thread2,NULL);



}

现在理想情况下,我希望它先打印 5000,然后打印 5001,因为线程 1 首先执行关键部分,然后线程 2。但猜猜怎么了!我得到 5001 和 5001 作为输出。

如果我用一些 print 语句替换 sleep 则不存在上述问题。

c pthreads
1个回答
0
投票

你的假设是有缺陷的。根据结果,我们知道

thread2
thread1
之前运行。这是允许的 - 信号量只会阻止它们同时运行

如果您希望函数 A 在函数 B 之前被调用,则按顺序在同一个线程中执行它们。

© www.soinside.com 2019 - 2024. All rights reserved.