2009-12-08 3 views
-1
#include<pthread.h> 
#include<stdio.h> 
#include<stdlib.h> 
#include<time.h> 
#define NUM_THREADS 8 

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) 
{ 
    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[1] = "French: Bonjour, le monde!"; 
messages[2] = "Spanish: Hola al mundo"; 
messages[3] = "Klingon: Nuq neH!"; 
messages[4] = "German: Guten Tag, Welt!"; 
messages[5] = "Russian: Zdravstvytye, mir!"; 
messages[6] = "Japan: Sekai e konnichiwa!"; 
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]); 
    if (rc) { 
    printf("ERROR; return code from pthread_create() is %d\n", rc); 
    exit(-1); 
    } 
    } 
pthread_exit(NULL); 
} 

выше фрагмент кода дает мне ошибку сегментации в Linux с помощью GCCпроблема Pthreads и несколько вопросов

Как новичок у меня есть несколько вопросов, в виду относительно нитей

  1. Если 3 потоки создаются одновременно, и если они должны выйти, то поток, который создается первым, удаляется в конце?
  2. Может о/р отличаются все время с создания потока и завершение программы, и если да, почему ?? (я заметил, что они делают это ");
+1

Я "ве попробовал вашу программу в QNX, работает отлично Пытались ли вы скомпилировать и запустить что-то простое, как int main() {printf ("Hello world \ n"); return 0;} ? –

ответ

2

Если 3 нити созданы одновременно, и если они должны выйти, тогда поток, который создается первым, завершен в конце?

Ответ: нет гарантии, что первый поток должен выйти первым. После их создания они рассматриваются как отдельные объекты посредством OS, и решать, какой из них будет выходить, зависит от ОС.

Могут ли o/p отличаться каждый раз от программы создания и завершения потоков, и если да, то почему? (Я заметил, что они это делают);

Ответ: Да, они отличаются друг от друга, причина такая же, как описано выше.

2

Как и когда каждый поток запланирован полностью для ОС. Невозможно понять это, не углубляясь в код ОС.

В большинстве реализаций pthreads (я не использовал все, но все, что я использовал).
Когда основной поток выходит из всех остальных потоков, прекратите выполнение, и приложение завершает работу.

Таким образом, перед выходом из основного потока следует дождаться (или убить) всех дочерних потоков перед выходом.
Для этого у нас есть pthread_join().

for(t=0;t<NUM_THREADS;t++) 
{ 
    void* result; 
    pthread_join(threads[t],&result); 
} 
// Now all the children are dead. 

Обратите внимание, что базовая система io не является потокобезопасной.
Итак, если несколько потоков записываются в IO, тогда вы можете получить некоторое чередование.

0

Ваш код работает perfectely (Я также использую GCC) ..

выход:.

Creating thread 0 
Creating thread 1 
Creating thread 2 
Creating thread 3 
Creating thread 4 
Creating thread 5 
Creating thread 6 
Creating thread 7 
Thread 1: French: Bonjour, le monde! Sum=1 
Thread 0: English: Hello World! Sum=0 
Thread 2: Spanish: Hola al mundo Sum=3 
Thread 4: German: Guten Tag, Welt! Sum=10 
Thread 3: Klingon: Nuq neH! Sum=6 
Thread 5: Russian: Zdravstvytye, mir! Sum=15 
Thread 6: Japan: Sekai e konnichiwa! Sum=21 
Thread 7: Latin: Orbis, te saluto! Sum=28