Как правильно вызвать функцию при создании pthread? - PullRequest
0 голосов
/ 03 мая 2019

Я создаю pthread в основной функции и вызываю другую функцию с именем «PrintHello». функция «PrintHello» должна печатать некоторые сообщения. Мои темы создаются, но я предполагаю, что моя функция "PrintHello" не вызывается должным образом, поскольку сообщения не печатаются.

Я поместил другую команду печати в функцию "PrintHello", и это печать. Это означает, что функция вызывается. но я не могу понять, почему сообщения не печатаются.

char *messages[NUM_THREADS];
struct thread_data
{
    int thread_id;
    int sum;
    char *message;
    };
struct thread_data thread_data_array[NUM_THREADS];

void *PrintHello(void *threadarg)
{
    printf("I am in PrintHello");
    int taskid , sum;
    char *hello_msg;
    struct thread_data *my_data;
    Sleep(1);
    my_data = (struct thread_data *) threadarg;
    taskid = my_data ->thread_id;
    sum = my_data ->sum;

    hello_msg = my_data ->message;
    printf("Thread %d: %s  Sum=%d\n", taskid , hello_msg , sum) ;

    pthread_exit(NULL);
}
int main(int argc , char *argv[])
{
    pthread_t threads[NUM_THREADS];
    int *taskids[NUM_THREADS];
    int rc, t, sum;
    sum=0;
    messages[0] = "English: Hello World!";
    ..............
    messages[7] = "Latin: Orbis , te saluto!";
for(t=0;t<NUM_THREADS;t++)
    {
        sum = sum + t;
        thread_data_array[t].thread_id = t;
        thread_data_array[t].sum = sum;
        thread_data_array[t].message = messages[t];
        printf("Creating thread %d\n", t);

        rc = pthread_create(&threads[t], NULL , PrintHello , (void *) &thread_data_array[t]);
        //rc = pthread_create(&threads[t], NULL , PrintHello , NULL);
        if (rc)
            {
                printf("ERROR; return code from pthread_create() is %d \n", rc);
                exit(-1);
            }
    }
        pthread_exit(NULL);
}

Код должен распечатать приветственные сообщения.

Ответы [ 2 ]

1 голос
/ 03 мая 2019

Я предполагаю, что происходит, если ваше приложение завершает работу до того, как ваши потоки получат возможность действительно выполнить полностью. Поскольку вы храните каждый дескриптор потока в массиве pthread_t threads[NUM_THREADS];, вам нужно будет создать вызов pthread_join должен быть сделан, что позволит блокировать поток вызывающей стороны, пока поток не будет выполнен и возвращен. Вы можете вызвать pthread_join сразу после вызова pthread_create или перебрать все свои дескрипторы и вызвать pthread_join для каждого индекса в вашем массиве. Если после создания каждого потока выполняется вызов pthread_join, новый поток не будет создан до тех пор, пока не завершится предыдущий. Если вы хотите выполнить их одновременно, лучшим вариантом будет цикл после создания всех потоков.

int main(int argc , char *argv[])
{
    pthread_t threads[NUM_THREADS];
    int *taskids[NUM_THREADS];
    int rc, t, sum;
    sum=0;
    messages[0] = "English: Hello World!";
    ..............
    messages[7] = "Latin: Orbis , te saluto!";
    for(t=0;t<NUM_THREADS;t++)
    {
        sum = sum + t;
        thread_data_array[t].thread_id = t;
        thread_data_array[t].sum = sum;
        thread_data_array[t].message = messages[t];
        printf("Creating thread %d\n", t);

        rc = pthread_create(&threads[t], NULL , PrintHello , (void *) &thread_data_array[t]);
        //rc = pthread_create(&threads[t], NULL , PrintHello , NULL);
        if (rc)
        {
            printf("ERROR; return code from pthread_create() is %d \n", rc);
            exit(-1);
        }
    }
    for(int index = 0; index < NUM_THREADS; ++index){
        pthread_join(threads[index],NULL);//Wait for execution of each thread
    }
}

Вам также не нужно звонить pthread_exit в своей главной. Обычно это следует вызывать в потоке, который вы хотите завершить досрочно, где значение, переданное в pthread_exit, можно получить из второго аргумента pthread_join

0 голосов
/ 05 мая 2019

Извините за поздний ответ. Я должен был упомянуть, что я использую Windows. Во всяком случае, я обнаружил проблему. Это происходит из-за аргумента «сна». Для окон видимо это отличается. поэтому я изменил свой аргумент сна на Sleep (1000), что, по-видимому, означает 1 секунду в Windows, и это решило мою проблему. Спасибо за все ответы.

...