gpt4 book ai didi

c - 在 C 中对 pthreads 使用互斥锁/解锁和广播

转载 作者:行者123 更新时间:2023-11-30 17:46:11 25 4
gpt4 key购买 nike

这是我的第一篇文章,我很兴奋。

我的问题是我正在用 C 创建一个石头剪刀布程序,其中父进程创建 2 个线程。然后,2 个线程随机扔一 block 石头、布或剪刀,并将值返回给父线程,父线程将对其进行计数,并返回 3 轮的结果,然后进行最终计数。

我的问题是我无法让线程正确启动,我让它们在我的 thread_function1 中等待,但随后它们只完成一轮,即使这样我也没有在结果中得到两个线程。如果有人可以阐明一些观点,我将非常感激!谢谢

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <pthread.h>
#include <sys/time.h>

#define NTHREADS 2
struct timeval tv;
void *thread_function1();
void *thread_function2();
char *guess_string(int g);
int wins[3];
int cmd_ready = 0;
int x1=0, x2=1, count=0;
int guess, object, turns, i, j, k,l, winner, cmd, go, y;
pthread_mutex_t cv_m;
pthread_mutex_t count_mutex;
pthread_cond_t cv;
int myindex;
int flag;
int throws[3];
int main(int argc, char *argv[])
{


wins[0] = 0; wins[1] = 0;
if ((argc != 2) || ((turns = atoi(argv[1])) <= 0))
{
fprintf(stderr,"Usage: %s turns\n", argv[0]);
return 0;
}

pthread_t thread_id1, thread_id2;


if (pthread_create(&thread_id1, NULL, thread_function1,&x1) != 0)
perror("pthread_create"),
exit(1);

if (pthread_create(&thread_id2, NULL, thread_function1,&x2) != 0)
perror("pthread_create"),
exit(1);

printf("Beginning %d Rounds...\nFight!\n", turns);
printf("Child 1 TID: %d\n", (unsigned int) thread_id1);
printf("Child 2 TID: %d\n", (unsigned int) thread_id2 );

for(k=0; k<turns; k++)
{

pthread_mutex_lock (&cv_m);
cmd = go;
cmd_ready = 2;
pthread_cond_broadcast(&cv);
pthread_mutex_unlock(&cv_m);
printf("------------------------\n");
printf("Round: %d\n", k+1);

printf("Child %d throws %s!\n",myindex+1, guess_string(myindex));

pthread_mutex_lock (&count_mutex);

winner = find_winner(throws[0], throws[1]);
while(count == 2){
if(winner >= 0)
{
printf("Child %d Wins!\n", winner+1);
wins[winner]++;
printf("6\n");
}else
{
printf("Game is a Tie!\n");
}
go--;
count = 0;
pthread_mutex_unlock(&count_mutex);
}
}

pthread_join(thread_id1,NULL);
pthread_join(thread_id2,NULL);

printf("------------------------\n");
printf("------------------------\n");
printf("Result:\n");
printf("Child 1: %d\n", wins[0]);
printf("Child 2: %d\n", wins[1]);
printf("Ties: %d\n", turns - (wins[0] + wins[1]));
printf("Child %d Wins!\n", (wins[0] > wins[1]) ? 1 : 2);

pthread_mutex_destroy(&cv_m);
pthread_cond_destroy(&cv);
pthread_exit(NULL);
return 0;

}

void *thread_function1(void *p)
{
struct timeval tv;
myindex = *(int *)p;
gettimeofday(&tv, NULL);
srand(tv.tv_sec + tv.tv_usec + getpid());
printf("1\n");
pthread_mutex_lock (&cv_m);
while(cmd_ready == 0)
{
printf("2\n");
pthread_cond_wait(&cv, &cv_m);
}
printf("3\n");

throws[myindex] = rand() % 3;
cmd_ready--;
printf("Ready: %d\n",cmd_ready);
pthread_mutex_unlock (&cv_m);
printf("4\n");

pthread_mutex_lock (&count_mutex);
count++;
printf("Count %d\n", count);
pthread_mutex_unlock(&count_mutex);

while(count == 2){
printf("5\n");
return NULL;
}

}

char *guess_string(int g){
switch(g){
case 0:
return "Rock";
break;
case 1:
return "Paper";
break;
case 2:
return "Scissors";
break;
}
}

int find_winner(int g1, int g2){
if(g1 == g2)
return -1;
else if ((g1 == 2) && (g2 == 0))
return 1;
else if ((g1 == 0) && (g2 == 2))
return 0;
else
return (g1 > g2) ? 0 : 1;
}

最佳答案

您似乎没有使用 pthread_mutex_initpthread_cond_init 初始化互斥锁或条件。

两个线程都在不 protected 情况下修改变量 myindex,更新该变量的第二个线程将是似乎返返回告的线程。

您还指望您的线程在 main 获取锁并发出广播之前开始等待条件,您可能会遇到 main 首先到达那里而您的线程尚未准备好的情况。

这应该是一个开始。

关于c - 在 C 中对 pthreads 使用互斥锁/解锁和广播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19414815/

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