gpt4 book ai didi

C、Pthreads - 如何重新执行指定的函数或start_routine

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

我是 C 编程新手,正在学习 C 语言类(class)。下面给出了给我的任务

  1. 创建一个运算符(一个运算符作为一个线程)
  2. 最初创建 10 个零售商(每个零售商一个线程)
  3. 最初创建 10 个客户(每个客户一个线程)

future 的任务需要之前创建的线程。还有更多任务,例如零售商通过运营商与客户进行沟通,但这不是我要问的

这是我的一些代码

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

#define NUM_THREAD 21


void* operator (void* arg) {
//Logic here
}

void* retailer(void *arg) {
//Logic here
}

void* customer(void* arg) {
//Logic here
}

main() {
pthread_t threads[NUM_THREAD];

int i = 0;
pthread_create(&threads[0],NULL , operator , NULL);
printf("Operator created.\n");

for ( i = 1 ; i < 11 ; i++) {
pthread_create(&threads[i], NULL , retailers ,NULL);

}

for (i = 11 ; i < NUM_THREAD ; i++) {
pthread_create(&threads[i], NULL , customers , NULL);

}

}

预期输出为

Operator created.
Retailer 1 Created.
...
Retailer 10 Created.
Customer 1 Created.
...
Customer 10 Created.
..The rest of output are the action between Operator , retailers and customers which involves semaphores and other stuff

我在互联网上搜索过,我对如何在创建线程后“重用”线程没有任何想法。当我创建一个线程时,它应该开始执行 pthread_create 中指定的函数。然而,该函数执行后,就失去了任务1、2、3的意义,因为任务3之后的任务需要这些线程。

明确地说,这是我的问题

  1. 如何创建线程并使其保持事件状态,以便以后可以重用该函数?
  2. 将 if...else 放入线程的 start_routine 中是一个好方法吗?

最佳答案

回答你的第一个问题,线程函数通常由启动代码、一些描述的长时间运行的循环和终止代码组成,例如下面的伪代码,作为粗略的说明:

def retailer:
initialise thread-local stuff
while termination condition not met:
do some processing
terminate thread-local stuff

因此,线程将继续运行,直到某些代码段(例如 CTRL-C 信号处理程序,或用户告诉它停止时的主线程)指示它应该停止为止。

请注意,正确使用保护线程之间共享的资源(例如检查终止条件和“执行某些处理”中涉及的任何线程间通信)是上述代码所固有的,我没有明确说明提到了,但应该这样做。

对于第二个问题,您几乎可以将任何您想要的代码放入线程函数中,就像它是普通的单线程代码一样。

线程引入了您通常不必关心的某些方面,例如竞争条件、线程本地存储或线程同步(互斥体、条件变量等),但您可以使用普通的 C 控制流像 ifwhile 这样的东西不用担心。

关于C、Pthreads - 如何重新执行指定的函数或start_routine,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27121187/

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