gpt4 book ai didi

c - 多线程 - 只有在所有线程都完成任务后才继续

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

我正在尝试使用多线程实现多线程(用户可以在启动程序时输入工作线程数 = 线程数)每个线程调用 functionA 和之后的 functionB。但是在 functionB 之前应该只在所有线程之后执行调用了函数A。那是我的伪代码:

void* worker_do(void* worker_id)
{
functionA((size_t) worker_id);
// First thread should only start functionB after ALL threads
// are finished with functionA
functionB((size_t) worker_id);
return NULL;
}

// I am not allowed to change pthread_create and pthread_join here
int main()
{
// should be a flexible value
ssize_t num_workers = 20;
pthread_t* workers = malloc(num_workers*sizeof(pthread_t));

for(ssize_t i = 0; i < num_workers; i++)
pthread_create(&workers[i], NULL, worker_do, (void*) i);

for(ssize_t i = 0; i < num_workers; i++)
pthread_join(workers[i], NULL);

free(workers);

return 0;
}

我用谷歌搜索并找到了“条件变量”的可能性。但我不确定表明他们必须为条件实现

IF last_thread_has_called_functionA THEN start_calling_fuctionB

或者条件变量不是解决这个问题的正确工具?

非常感谢提示我如何实现它...

罗伯特

最佳答案

我假设 functionA()functionB() 可以由线程并行执行,因为您当前的代码中没有互斥锁保护。

为了解决您的问题,您可以使用简单的轮询机制。 functionA() 执行后,每个线程都会递增一个计数器。所有线程都将等待,直到计数器等于创建的线程数。

对于这种方法,您需要有一个在所有线程中通用的互斥锁和计数器。为了简化代码,我使用了一个全局变量。

unsigned int num_threads = 0;
unsigned int num_threads_completed_functionA = 0;
pthread_mutex_t lock;

void* worker_do(void* worker_id)
{
functionA((size_t) worker_id);
// First thread should only start functionB after ALL threads are finished with functionA

//Lock the mutex and update the counter
pthread_mutex_lock(&lock);
num_threads_completed_functionA++;
pthread_mutex_unlock(&lock);

while(1)
{
//Lock mutex and check how many threads completed execution of functionA()
pthread_mutex_lock(&lock);
if(num_threads_completed_functionA == num_threads)
{
//If all threads completed, then break the loop and proceed executing functionB()
pthread_mutex_unlock(&lock);
break;
}
pthread_mutex_unlock(&lock);
usleep(1); //Sleep for some time
}

//ALL threads are finished with functionA
functionB((size_t) worker_id);
return NULL;
}

关于c - 多线程 - 只有在所有线程都完成任务后才继续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55668308/

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