gpt4 book ai didi

c - 在 2 个线程之间交替

转载 作者:太空宇宙 更新时间:2023-11-04 04:59:43 25 4
gpt4 key购买 nike

我想编写一个程序,用 2 个函数写入 1 到 100 之间的奇数和偶数,第一个函数打印前 5 个奇数,第二个函数打印前 5 个偶数,然后我们再次返回到第一个打印第二个5个奇数的功能等等。在这个程序中,我只想在 2 线程之间交替,但我找不到解决方案。这是我的代码,在这段代码中我创建了 40 线程。有谁知道如何在 2 个线程之间交替并找到相同的输出。

#include<stdio.h>
#include<pthread.h>
pthread_t tid[40];
int pair=2;
int impair=1 ;
pthread_mutex_t lock;

void* genpair(void *arg)
{
pthread_mutex_lock(&lock);
int i = 0;
for (i=0 ; i<5 ; i++,pair+=2)
{
printf("%d ",pair) ;
}
printf(" ");
pthread_mutex_unlock(&lock);

return NULL;
}
void* genimpair(void *arg)
{
pthread_mutex_lock(&lock);
int i = 0;
for (i=0 ; i<5 ; i++,impair+=2)
{
printf("%d ",impair) ;
}
printf(" ");
pthread_mutex_unlock(&lock);

return NULL;
}

int main(void)
{
int i = 0;
int j=0 ;
int err;

if (pthread_mutex_init(&lock, NULL) != 0)
{
printf("\n mutex init failed\n");
return 1;
}

for(j=0 ; j<20 ; j+=2)
{
pthread_create(&(tid[j]), NULL, &genpair, NULL);
pthread_create(&(tid[j+1]), NULL, &genimpair, NULL);
pthread_join(tid[j], NULL);
pthread_join(tid[j+1], NULL);
}

pthread_mutex_destroy(&lock);

return 0;
}

最佳答案

仅使用互斥锁,您无法确保哪个线程能够先于另一个线程通过。互斥量只是为了确保只有一个线程能够运行关键代码。您可以使用与互斥体关联的条件变量,使它们一个接一个地传递,如以下伪代码所示:

// thread1
do {
lock(m);
while (turn==0) cond_wait(m); // release the key if not my turn, retry until my turn
do my job;
turn = 0; // give hand to the other
cond_broadcast(m); // awake threads waiting for key (blocked in lock or cond_wait)
unlock(m); // release the lock
} while ();

// thread2
do {
lock(m);
while (turn==1) cond_wait(m);
do my job;
turn = 1;
cond_broadcast(m);
unlock(m);
} while();

您也可以为同一个作业使用两个信号量...

关于c - 在 2 个线程之间交替,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33423221/

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