gpt4 book ai didi

C使用信号量和线程打印乒乓球

转载 作者:太空狗 更新时间:2023-10-29 16:06:37 25 4
gpt4 key购买 nike

我不确定我是否理解信号量和线程,所以我决定尝试一个相对简单的示例。我试图让 2 个线程交替打印,一个打印“ping”,另一个打印“pong”,每个线程都通知另一个它是通过使用信号量完成的。但是,当我执行下面的代码时,它会打印数百次 ping,然后打印数百次 pong,并稍作停顿。

#include <semaphore.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
sem_t pingsem;

void ping(){
printf("Ping started\n");
while(1){
sem_wait(&pingsem);
printf("ping\n");
sem_post(&pingsem);
}
}

void pong(){
printf("Pong started\n");
while(1){
sem_wait(&pingsem);
printf("pong\n");
sleep(1);
sem_post(&pingsem);
}
}

int main(){
sem_destroy(&pingsem); //make sure the semaphore starts dead
sem_init(&pingsem, 0, 1); //initialize semaphore
pthread_t ping_thread, pong_thread; //start the threading
pthread_create(&ping_thread, NULL, ping, NULL);
pthread_create(&pong_thread, NULL, pong, NULL);
pthread_join(ping_thread,NULL);
pthread_join(pong_thread,NULL);

return 0;
}

我编译使用:

gcc stest.c -o stest -lpthread -lrt

没有错误或警告,但是当我运行它时我得到:

$ ./stest
Ping started
ping
ping
ping
ping
Pong started
ping
ping
.
. hundreds of pings
.
ping
ping
ping
pong
pong
pong
pong
.
. hundreds of pongs
.

它最终会关闭,但为什么线程不会每隔一个线程交替打印?

最佳答案

您的示例中显示的问题是,这是一场竞赛,因为没有一个读取有效地阻止了另一个。两个线程都在调度程序允许的情况下运行。按照它的编码方式,每个线程都可以在其时间片内自由运行(循环)多次,并满足自己的信号量测试。在具有典型调度的多核/多 CPU 系统上,两个线程都可以同时运行并在某种程度上任意地相互跨越。

这是一个有效的乒乓线程示例,它使用互补信号量来创建您想要的乒乓互锁。

#include <semaphore.h>
#include <pthread.h>
#include <stdio.h>

sem_t pingsem, pongsem;

void *
ping(void *arg)
{
for (;;) {
sem_wait(&pingsem);
printf("ping\n");
sem_post(&pongsem);
}
}

void *
pong(void *arg)
{
for (;;) {
sem_wait(&pongsem);
printf("pong\n");
sem_post(&pingsem);
}
}

int
main(void)
{
sem_init(&pingsem, 0, 0);
sem_init(&pongsem, 0, 1);
pthread_t ping_thread, pong_thread;
pthread_create(&ping_thread, NULL, ping, NULL);
pthread_create(&pong_thread, NULL, pong, NULL);
pthread_join(ping_thread, NULL);
pthread_join(pong_thread, NULL);
return 0;
}

关于C使用信号量和线程打印乒乓球,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29529476/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com