Я должен создать 49 потоков в определенном процессе (в моей задаче несколько процессов, поэтому давайте назовем процесс P3). Я создал эти потоки, но проблема возникает здесь: в любое время максимум 5 потоков могут работать в P3 без учета основного процесса. Поток 13 из P3 может завершаться только в том случае, если в общей сложности запущено 5 потоков (поток 13 входит в число этих 5 потоков). Мой вопрос: как мне убедиться, что в какой-то момент выполнения программы будет запущено 5 потоков, и среди них будет Поток 13, чтобы он мог завершить свое выполнение. Я использую C в качестве языка программирования и Linux системные вызовы. Более того, мне не разрешено использовать «sleep ()» и «usleep ()».
Это функция, в которой я считаю количество потоков.
`void * thread_function2 ( void * arg) {
TH_STRUCT* st=(TH_STRUCT*)arg;
sem_wait(&sem);
sem_wait(&sem2);
nrThreads++;
sem_post(&sem2);
printf("Number of threads running: %d\n",nrThreads);
sem_wait(&sem3);
nrThreads--;
sem_post(&sem3);
sem_post(&sem);
return 0;
} `
Эта часть из основного потока, в котором я создаю свои темы: sem_init(&sem,0,5);
sem_init(&sem2,0,1);
sem_init(&sem3,0,1);
sem_init(&sem4,0,1);
for(int i=1;i<=49;i++)
{
params1[i].procNum=3;
params1[i].threadNum=i;
pthread_create(&tids1[i],NULL,thread_function2,¶ms1[i]);
}
`
Начало потока выполняется с помощью функции fuction info (args), которая печатает слово BEGIn и номер потока.
Завершение потока выполняется с помощью функции info (args), которая печатает слово END и поток число.
Это пример вывода и того, что делают потоки, когда они начинаются и когда они заканчиваются:
[ ] BEGIN P5 T0 pid=30059 ppid=30009 tid=-99981504
[ ] END P5 T0 pid=30059 ppid=30009 tid=-99981504
[ ] BEGIN P6 T0 pid=30060 ppid=30009 tid=-99981504
[ ] END P6 T0 pid=30060 ppid=30009 tid=-99981504
[ ] BEGIN P7 T0 pid=30061 ppid=30009 tid=-99981504
[ ] END P7 T0 pid=30061 ppid=30009 tid=-99981504
[ ] BEGIN P8 T0 pid=30062 ppid=30009 tid=-99981504
[ ] END P8 T0 pid=30062 ppid=30009 tid=-99981504
[ ] END P3 T0 pid=30009 ppid=30006 tid=-99981504
[ ] BEGIN P9 T0 pid=30063 ppid=30006 tid=-99981504
[ ] BEGIN P9 T4 pid=30063 ppid=30006 tid=-125163776
[ ] BEGIN P9 T1 pid=30063 ppid=30006 tid=-125163776
[ ] END P9 T1 pid=30063 ppid=30006 tid=-125163776
[ ] BEGIN P9 T2 pid=30063 ppid=30006 tid=-108378368
[ ] END P9 T4 pid=30063 ppid=30006 tid=-125163776
[ ] END P9 T2 pid=30063 ppid=30006 tid=-108378368
[ ] BEGIN P9 T3 pid=30063 ppid=30006 tid=-116771072
[ ] END P9 T3 pid=30063 ppid=30006 tid=-116771072
[ ] END P9 T0 pid=30063 ppid=30006 tid=-99981504
[ ] END P1 T0 pid=30006 ppid=3467 tid=-99981504