Как создать N потоков?

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

int threads = 5; // (dynamic, not hard-coded)
int i = 0;
pthread_t * thread = malloc(sizeof(pthread_t)*threads);

for (i = 0; i < threads; i++) {
    pthread_t foobar;
    thread[i] = foobar; // will this cause a conflict?
}

for (i = 0; i < threads; i++) {

    int ret = pthread_create(&thread[i], NULL, (void *)&foobar_function, NULL);

    if(ret != 0) {
        printf ("Create pthread error!n");
        exit (1);
    }
}

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

int threads = 5;
int i;

pthread_t * thread = malloc(sizeof(pthread_t)*threads);

for (i = 0; i < threads; i++) {

    int ret = pthread_create(&thread[i], NULL, &foobar_function, NULL);

    if(ret != 0) {
        printf ("Create pthread error!n");
        exit (1);
    }
    // pthread_join(thread[i], NULL); // don't actually want this here :)
}

sleep(1);     // main() will probably finish before your threads do,
free(thread); // so we'll sleep for illustrative purposes

3 ответов


что в первом цикле? Устанавливает ли он элементы массива в неинициализированные значение?

Так что я думаю, что это то, что вам нужно:

int threads = 5, i = 0, ret = -1;

pthread_t * thread = malloc(sizeof(pthread_t)*threads);

for (i = 0; i < threads; i++) {

    ret = pthread_create(&thread[i], NULL, &foobar_function, NULL);

    if(ret != 0) {
        printf ("Create pthread error!\n");
        exit (1);
    }
}

нерестится темы темы, начиная с foobar_function в каждой. И у вас есть (если все пойдет хорошо:)) их идентификаторы в нить массив. Так, например, вы можете отменить второй поток, вызвав pthread_cancel(thread[1]) etc.


первый for цикл недопустим C, и я не уверен, что вы хотите, чтобы он делал. Просто удалите его, и остальная часть кода выглядит нормально, кроме неправильного приведения на foobar_function. Актерский состав должен быть:

(void *(*)(void *))foobar_function

но если тип уже не такой или что-то очень близкое, ваша программа, вероятно, имеет неопределенное поведение. Было бы лучше исправить сигнатуру функции, чтобы не было необходимости в приведении.


Если вы пытаетесь написать многопоточную программу, но не понимаете, как выделить структуру данных динамического размера, вы можете делать вещи неправильно.

научитесь ходить, прежде чем бежать.

рассмотрите возможность использования более простого языка и избежания использования (явных) потоков.

потоки очень трудно использовать правильно; динамически размера массива очень легко достичь (даже довольно легко в C)