Идентичные идентификаторы потока

0

Я написал код для многопоточности, чтобы сравнить скорость записи и чтения dd.

Все компилируется и работает нормально, но я заметил, что идентификатор потока идентичен.

Поэтому я создал условие (см. Комментарии к коду), что удивительно показало, что каждый отдельный поток, который я создаю, имеет тот же ID.

int main(int argc, char *argv[]) {
    //long filesize = 10000000;
    int nb_threads = atoi(argv[2]);
    pthread_t tid[4];
    int ok;
    double latency;
    double bandwith;
    int err;
    int i = 0;
    srand(time(NULL));
    while(i < nb_threads){
        pthread_create(&(tid[i]),NULL,launch_dd_bm,(void *) argv);
        pthread_join(tid[i], NULL);
        /* if(!pthread_equal(tid[i],tid[i-1])){
               printf("Thread ID: %u",tid[i]);
               i++;
            }
        */ 
        i++;
    }   
    return EXIT_SUCCESS;
}

void *launch_dd_bm(void *arg);

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

Теги:
multithreading
pthreads

2 ответа

2
Лучший ответ

Вы вызываете pthread_join() сразу после создания потока, так что происходит
выполнение основного потока останавливается и ждет, пока созданный поток завершит его
выполнение. Когда первый поток заканчивается, его ИД больше не используется и, таким образом, тот же ИД
"может быть приобретен" потоком, который создается впоследствии. Вот почему все
ваши потоки имеют одинаковый идентификатор.
Чтобы избежать этой проблемы, вы должны вызвать pthread_join() вне цикла while.

2

pthread_create хранит "идентификатор созданного потока". Таким образом, идентификаторы потоков гарантируют, что они будут уникальными среди текущих запущенных потоков, а не среди всех потоков, когда-либо созданных в процессе. Когда поток выходит, его идентификатор можно безопасно повторно использовать. Это аналогично тому, как malloc возвращает новые указатели, пока вы их не освобождаете, и в этот момент освобождаемые вами могут быть повторно использованы.

Если вам нужен действительно постоянный идентификатор, легко реализовать общий счетчик, например, увеличивая глобальную переменную из launch_dd_bm (и не забывая защищать ее с помощью мьютекса).

  • 0
    Но все мои потоки должны работать параллельно, так почему же это не так? Для сравнения моего dd мне нужно писать или читать одновременно несколькими потоками.
  • 4
    @JahMyst Если вы хотите, чтобы ваши потоки работали параллельно, не вызывайте pthread_join() в цикле сразу после pthread_create() .
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню