小默

thread 多线程

多线程

编写多线程程序时,在设计上要特别小心.
对共享变量,多个执行路径,要引起足够重视.

创建多线程:
/*
 * 多线程
 
*/
#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程序设计

posted on 2011-06-14 20:27 小默 阅读(384) 评论(0)  编辑 收藏 引用 所属分类: Linux


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

统计

留言簿(13)

随笔分类(287)

随笔档案(289)

漏洞

搜索

积分与排名

最新评论

阅读排行榜