多線程
編寫多線程程序時,在設計上要特別小心.
對共享變量,多個執行路徑,要引起足夠重視.
創建多線程:
/*
* 多線程
*/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
#define NUM_THREADS 6
void *thread_function(void *arg);
int main(){
int res;
pthread_t a_thread[NUM_THREADS];
void *thread_result;
int lots_of_threads;
for(lots_of_threads = 0; lots_of_threads < NUM_THREADS; lots_of_threads++){
printf("before pthread_create, lots_of_threads=%d\n",lots_of_threads);
res = pthread_create(&(a_thread[lots_of_threads]),NULL,
thread_function, (void *)&lots_of_threads);
if(res != 0){
perror("Thread creation failed");
exit(EXIT_FAILURE);
}
}
printf("Waiting for threads to finish
\n");
for(lots_of_threads = NUM_THREADS - 1; lots_of_threads >= 0; lots_of_threads--){
res = pthread_join(a_thread[lots_of_threads], &thread_result);
if(res == 0){
perror("Picked up a thread\n");
}
else{
perror("pthread_join failed\n");
}
}
printf("All done\n");
exit(EXIT_SUCCESS);
}
void *thread_function(void *arg){
int my_number = *(int *)arg;
int rand_num;
printf("thread_funcion is running. Argument was %d\n", my_number);
rand_num = 1+(int)(9.0*rand()/(RAND_MAX+1.0));
sleep(rand_num);
printf("Bye from %d\n", my_number);
pthread_exit(NULL);
} 執行結果:
[green@colorfulgreen ch11]$ gcc -D_REENTRANT thread8.c -o thread8 -lpthread
[green@colorfulgreen ch11]$ ./thread8
before pthread_create, lots_of_threads=0
before pthread_create, lots_of_threads=1
before pthread_create, lots_of_threads=2
before pthread_create, lots_of_threads=3
before pthread_create, lots_of_threads=4
before pthread_create, lots_of_threads=5
Waiting for threads to finish
thread_funcion is running. Argument was 5
thread_funcion is running. Argument was 5
thread_funcion is running. Argument was 5
thread_funcion is running. Argument was 5
thread_funcion is running. Argument was 5
thread_funcion is running. Argument was 5
Bye from 5
Bye from 5
Picked up a thread
: Success
Bye from 5
Picked up a thread
: Success
Bye from 5
Picked up a thread
: Success
Bye from 5
Picked up a thread
: Success
Bye from 5
Picked up a thread
: Success
Picked up a thread
: Success
All done 從執行結果里,很顯然看到有bug,5個線程的argument全是5.
因為新線程的參數,是使用地址引用傳遞的:
res = pthread_create(&(a_thread[lots_of_threads]),NULL,
thread_function, (void *)&lots_of_threads);
主線程創建線程循環,很快執行完. 引用地址中的值,在子線程執行前,已經被改成了5.
線程參數改成值傳遞就好了.
--
FROM:Linux程序設計