gpt4 book ai didi

c - 如何在 C 中使用 pthread 交替 5 个 0 值和 5 个 1 值?

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

我有一个使用 C 语言的小作业,它用交替的 5 个 0 值(由一个线程写入)和 5 个 1 值(由第二个线程写入)填充大小为 30 的整数数组。

这是迄今为止我的代码:

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

int count = 0;
int oktogo = 1; //0 is false, 1 is true. For thread2 this is reversed.

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t condition = PTHREAD_COND_INITIALIZER;

void *start_thread_one()
{
int i;
for (i=1;i<30;i++) {
pthread_mutex_lock(&mutex);
while (oktogo == 0)
pthread_cond_wait(&condition, &mutex);
count=0;
printf("thread one: %d\n", count);
oktogo = 0;
pthread_mutex_unlock(&mutex);
pthread_cond_signal(&condition);
}
pthread_exit(0);
}

void *start_thread_two()
{
int i;
for(i=1;i<30;i++) {
pthread_mutex_lock(&mutex);
while (oktogo == 1)
pthread_cond_wait(&condition, &mutex);
count =1;
printf("thread two: %d\n", count);
oktogo = 1;
pthread_mutex_unlock(&mutex);
pthread_cond_signal(&condition);
}
pthread_exit(0);
}

int main ()
{
int count = 0;
pthread_t p1,p2;

pthread_create(&p1,NULL,(void *)start_thread_one,NULL);
pthread_create(&p2,NULL,(void *)start_thread_two,NULL);

pthread_join(p1,NULL);
pthread_join(p2,NULL);

return(0);
}

输出仅显示线程一的值为 0,然后线程二的值为 1。如何交替打印 5 个 0 值和 5 个 1 值,而不是逐一打印?

截图:

enter image description here

最佳答案

您的线程同步逻辑似乎没问题。

唯一的问题是,当您有机会[并让主线程]在加入线程后将其打印出来时,您实际上并没有将其存储到数组中。

此外,您实际上并不需要两个单独的线程函数。您可以使用一个参数/值为 0 或 1 的参数。也就是说,参数指定线程数组的起始偏移量、要存储的值以及 oktogo 所需的值>.

无论如何,这是一个工作版本:

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

int count = 0;
int oktogo = 0; // 0 is false, 1 is true. For thread2 this is reversed.

#define CHUNK 5
int array[5000];

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t condition = PTHREAD_COND_INITIALIZER;

void *
start_thread(void *ptr)
{
long self = (long) ptr;
int i;

for (i = 1; i < 30; i++) {
pthread_mutex_lock(&mutex);

while (oktogo != self)
pthread_cond_wait(&condition, &mutex);

printf("thread %ld: %d\n",self,count);
for (int idx = 0; idx < CHUNK; ++idx, ++count)
array[count] = self;

oktogo = ! self;
pthread_mutex_unlock(&mutex);
pthread_cond_signal(&condition);
}

pthread_exit(0);
}

int
main()
{
int count = 0;
pthread_t p1,
p2;

for (int idx = 0; idx < sizeof(array) / sizeof(array[0]); ++idx)
array[idx] = -1;

pthread_create(&p1, NULL, (void *) start_thread, (void *) 0);
pthread_create(&p2, NULL, (void *) start_thread, (void *) 1);

pthread_join(p1, NULL);
pthread_join(p2, NULL);

for (int idx = 0; idx < sizeof(array) / sizeof(array[0]); ++idx) {
if (array[idx] >= 0)
printf("%d: %d\n",idx,array[idx]);
}

return (0);
}

关于c - 如何在 C 中使用 pthread 交替 5 个 0 值和 5 个 1 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53508558/

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