У меня возникли некоторые проблемы с выводом потоков в правильном порядке. Моя программа должна принимать как минимум 2 параметра (может быть больше, но всегда 2 за раз, потому что один из них — целое число (сколько секунд поток ждет), а другой — char* (просто обычное сообщение)). Вывод программы — это номер потока (индекс) и сообщение из второго параметра, но потоки нужно отсортировать по времени, которое у них было с первого параметра. Основной поток должен ждать все остальные потоки. Будет максимум 10 потоков.
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
void* thread_main(void* arg){
sleep(1);
return NULL;
}
int main(int argc, char** argv){
pthread_t tid[10];
int s;
int index=0;
for(int i=1;i<argc;i+=2){
int param1= atoi(argv[i]);
char* param2= argv[i+1];
s=pthread_create(&tid[index],NULL,thread_main,NULL);
usleep(param1*1000);
printf("Thread %d : %s\n",index+1,param2);
index++;
}
for(int i=0;i<index+1;i++){
s=pthread_join(tid[i],NULL);
}
return 0;
}
Это мой код. Когда я ввожу параметры для кода:
300 это_последнее 100 это_первое 200 это_среднее
Вывод должен быть таким:
Thread 2 : this_is_first
Thread 3 : this_is_middle
Thread 1 : this_is_last
Но с моим кодом я получаю это:
Thread 1 : this_is_last
Thread 2 : this_is_first
Thread 3 : this_is_middle
Я новичок в этом деле и не знаю, как это исправить.
решение1
Глядя на код. В потоках нет выходных данных. Поэтому потоки ничего не делают. Вы можете удалить create_thread, и это будет делатьточнотоже самое.
Вывод будет осуществляться в последовательном порядке. С разным временем (согласно четным параметрам).
Также каждый поток называется thread_main.
Что делать.
Поместите изменяющуюся задержку и printf
в thread_main. (И дайте ему лучшее имя). Затем вам нужно передать сообщение и идентификатор потоку.
Видетьруководстводля примера того, как это сделать. Примечание tinfo
передается в поток.
Я бы начал с 3 процедур, по одной на каждый поток, с разными сообщениями и идентификаторами. Когда это заработает, начните изучать, как передавать им информацию при запуске.