Как породить н темы? - PullRequest
       4

Как породить н темы?

8 голосов
/ 11 февраля 2011

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

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 ]

7 голосов
/ 11 февраля 2011

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

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

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 в каждом.И у вас есть (если все идет хорошо :)) их идентификаторы в thread массив.Так, например, вы можете отменить второй поток, позвонив pthread_cancel(thread[1]) и т. Д.

1 голос
/ 11 февраля 2011

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

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

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

0 голосов
/ 02 мая 2011

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

Научитесь ходитьперед запуском.

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

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

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