Как создать переменное количество pthreads? - PullRequest
2 голосов
/ 02 ноября 2019

Часть задания по программированию, которое я имею в колледже, задает:

для потоков, инициализирует большой массив pthread_t* в main() и динамически создает pthread_t для каждого нового студентаиспользуя malloc(sizeof(pthread_t).

Кажется достаточно простым. Все, что мне нужно сделать, это что-то вроде:

pthread_t *pthreadArray = malloc(sizeof(pthread_t) * userInputSize);

, чтобы создать переменное количество потоков. Однако нам не дают userInputSize. Как это возможно тогда? Если бы я просто сделал:

pthread_t *pthreadArray = malloc(sizeof(pthread_t));  

, разве это не дало бы мне всего лишь одну работу? Я чувствую, как будто это должно быть проблемой в инструкциях по программированию. Есть идеи?

1 Ответ

2 голосов
/ 02 ноября 2019

Сделайте так, как указано в присваивании:

для потоков, инициализируйте большой массив pthread_t* в main()

/* Large number */
const size_t max_threads = 100;

/* Large array of pointers with every element initialized to zero */ 
pthread_t *student_threads[max_threads] = {};

size_t thread_count = 0;

и динамически создайте pthread_t для каждого нового ученика, используя malloc(sizeof(pthread_t))

pthread_t *new_student = malloc(sizeof(pthread_t));

Что не написано, так это то, что вы делаете с new_student. Это действительно указатель на один pthread_t. Просто поместите указатель в следующий неиспользуемый слот в вашем массиве:

/* Find next unused spot in array (with value==NULL) */
size_t i = 0
while (i < max_threads && student_threads[i])
   i++;

/* assign value to that spot */
student_threads[i] = new_student;
thread_count++;

Не забудьте добавить проверку ошибок, где это необходимо. И освободите все ресурсы, когда вы закончите с ними.

Это включает установку student_threads[i]=NULL всякий раз, когда вы вызываете free(student_threads[i]), чтобы вы знали, какие слоты в массиве не используются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...