Chinaunix首页 | 论坛 | 博客
  • 博客访问: 652365
  • 博文数量: 128
  • 博客积分: 4385
  • 博客等级: 上校
  • 技术积分: 1546
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-22 14:05
文章分类

全部博文(128)

文章存档

2012年(2)

2011年(51)

2010年(75)

分类: LINUX

2010-08-27 08:32:47

通过创建两个线程来实现对一个数的递加。
   可见:用pthread_join,多个线程同步执行,主进程等待所有线程终止后执行。

/*function: a multiple thread programming in linux
 *author: Andy
 *E-mail : shangguanhua@gmail.com
 */

#include <pthread.h>
#include <stdio.h>
#include <sys/time.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#define MAX 10

pthread_mutex_t mut;
pthread_t pthread[2];
int a = 0, i;

void *pthread0(void)
{
    for(i = 0; i < MAX; i++)
    {
    printf("thread0 : a = %d\n", a);
    pthread_mutex_lock(&mut);
        a++;
    pthread_mutex_unlock(&mut);
    sleep(3);
    }
    pthread_exit(NULL);
}

void *pthread1(void)
{    for(i = 0; i < MAX; i++)
    {
    printf("thread1 : a = %d\n", a);
    pthread_mutex_lock(&mut);
        a++;
    pthread_mutex_unlock(&mut);
    sleep(2);
    }
    pthread_exit(NULL);
}
void mypthread_create(void)
{
    memset(pthread, 0, sizeof(pthread));

    if(pthread_create(&pthread[0], NULL, (void *)pthread0, NULL) != 0)
    {
        printf("creat 0 error\n");
        exit(1);
    }
    else
    {
        printf("pthread0 ok\n");
    }
    if(pthread_create(&pthread[1], NULL, (void *)pthread1, NULL) != 0)
    {
        printf("creat 1 error\n");
        exit(1);
    }
    else
    {
        printf("pthread1 ok\n");
    }
}

void pthread_wait(void)
{
    if(pthread[0] != 0)
    {
        pthread_join(pthread[0], NULL);
    }
    if(pthread[1] != 0)
    {
        pthread_join(pthread[1], NULL);
    }
}

int main(void)
{
    pthread_mutex_init(&mut, NULL);
    
    mypthread_create();
    
    pthread_wait();
    
    return 0;
}

执行结果:

[gh@localhost pthread]$ ./add
pthread0 ok
pthread1 ok
thread0 : a = 0
thread1 : a = 0
thread1 : a = 2
thread0 : a = 3
thread1 : a = 4
thread0 : a = 5
thread1 : a = 6
thread1 : a = 7
thread0 : a = 8
thread1 : a = 9
thread0 : a = 10


注意:

1.学习代码风格, 多函数,结构清晰,可读性强  全局变量的使用

易错点: if(pthread_create(&pthread[0], NULL, (void *)pthread0, NULL) != 0)
  此处pthread0,线程函数作为参数时的应用!不太明白

部分参考:

阅读(3968) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~