gpt4 book ai didi

c - 3 只猴子,打印值必须与信号量同步

转载 作者:太空宇宙 更新时间:2023-11-03 23:19:38 25 4
gpt4 key购买 nike

3只猴子,每只猴子都打印它的值。 Monkey1() 打印 1,依此类推。第一个猴子是最强的,他打印两次 1,然后 monkey2 打印 2,然后 monkey1 再次打印,然后 monkey2,然后 monkey3 可以打印他的值。

预期输出:1 1 2 1 1 2 3 1 1 2 1 1 2 3 1 1 2 等等..

我只能使用 2 个信号量,每个猴子都是一个线程。

好吧,我已经考虑了一个多小时了,我仍然不确定如何实现它。我很想就如何处理这个问题获得一些指导。

这里的代码是这样的,如果这对我使用的系统/语言有帮助,代码在诅咒的那一刻不工作..

#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/types.h>
#include <string.h>
#include <pthread.h>
#include <semaphore.h>

//3 monkeys so N = 3
#define N 3

sem_t s1,s2;

void* Monkey1(void* param)
{
int i;

for(i = 0; i < 2; i++){
printf("1");
sem_wait(&s1);
}

}
void* Monkey2()
{
int i;
for(i = 0; i < 2; i++){
sem_post(&s1);
}
printf("2");
sem_wait(&s2);
}
void* Monkey3()
{
printf("3");
//sem_wait(&s1);
}


void main()
{
pthread_t thread[N];
int i, ans[N];

sem_init(&s1, 0, 1);
sem_init(&s2,0,0);

for(i=0;i<N;i++)
{
ans[i] = i + 1;
}

if (pthread_create ( &thread[0] , NULL , Monkey1 , (void*)&ans[0]) != 0 )
{
perror( "Could not create thread" );
exit(1);
}


if (pthread_create ( &thread[1] , NULL , Monkey2 , (void*)&ans[1]) != 0 )
{
perror( "Could not create thread" );
exit(1);
}

if (pthread_create ( &thread[2] , NULL , Monkey3 , (void*)&ans[2]) != 0 )
{
perror( "Could not create thread" );
exit(1);
}


for(i=0;i<N;i++)
{
pthread_join( thread[i], NULL );
}


}

最佳答案

这就是它的实现方式(我已经包含了注释来解释它是如何工作的;并不是说两个信号量都初始化为值 1 并且有一些 sleep(1) 调用来创建线程隔行扫描在屏幕上可见):

#define N 3

sem_t s1, s2;

void *Monkey1(void *param) {
while (1) {
sleep(1);
for (int j = 0; j < 2; j++) {
sleep(1);
sem_wait(&s1);
for (int i = 0; i < 2; i++) {
printf("1\n");
}
sem_post(&s1);
}
}
}
void *Monkey2() {
while (1) {
sleep(1);
sem_wait(&s2); // Wait for monkey 3
for (int i = 0; i < 2; ++i) {
sleep(1);
sem_wait(&s1); // Wait for monkey 1
printf("2\n");
sem_post(&s1);
}
sem_post(&s2);
}
}
void *Monkey3() {
while (1) {
sleep(1);
sem_wait(&s2); // Wait for monkey 2
sleep(1);
sem_wait(&s1); // Wait for monkey 1
printf("3\n");
sem_post(&s2);
sem_post(&s1);
}
}
int main() {
pthread_t thread[N];
int i, ans[N];

sem_init(&s1, 0, 1);
sem_init(&s2, 0, 1);

for (i = 0; i < N; i++) {
ans[i] = i + 1;
}

if (pthread_create(&thread[0], NULL, Monkey1, NULL) != 0) {
perror("Could not create thread");
exit(1);
}

if (pthread_create(&thread[1], NULL, Monkey2, NULL) != 0) {
perror("Could not create thread");
exit(1);
}

if (pthread_create(&thread[2], NULL, Monkey3, (void *)&ans[2]) != 0) {
perror("Could not create thread");
exit(1);
}

for (i = 0; i < N; i++) {
pthread_join(thread[i], NULL);
}
return 0;
}

关于c - 3 只猴子,打印值必须与信号量同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44166213/

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