当前访客身份:游客 [ 登录 | 加入 OSCHINA ]

代码分享

当前位置:
代码分享 » C/C++  » 编程基础
红薯

Linux 的C语言多线程编程一例

红薯 发布于 2010年10月18日 7时, 12评/10231阅
分享到: 
收藏 +0
1
我们通过创建两个线程来实现对一个数的递加。或许这个实例没有实际运用的价值,但是稍微改动一下,我们就可以用到其他地方去拉。
标签: Linux 多线程 GCC

代码片段(2) [全屏查看所有代码]

1. [代码]thread_example.c     跳至 [1] [2] [全屏预览]

/**
  *thread_example.c :  c multiple thread programming in linux
  *author : falcon
  *E-mail : tunzhj03@st.lzu.edu.cn
  */
#include <pthread.h>
#include <stdio.h>
#include <sys/time.h>
#include <string.h>
#define MAX 10

pthread_t thread[2];
pthread_mutex_t mut;
int number=0, i;

void *thread1()
{
        printf ("thread1 : I'm thread 1\n");

        for (i = 0; i < MAX; i++)
        {
                printf("thread1 : number = %d\n",number);
                pthread_mutex_lock(&mut);
                        number++;
                pthread_mutex_unlock(&mut);
                sleep(2);
        }


        printf("thread1 :主函数在等我完成任务吗?\n");
        pthread_exit(NULL);
}

void *thread2()
{
        printf("thread2 : I'm thread 2\n");

        for (i = 0; i < MAX; i++)
        {
                printf("thread2 : number = %d\n",number);
                pthread_mutex_lock(&mut);
                        number++;
                pthread_mutex_unlock(&mut);
                sleep(3);
        }


        printf("thread2 :主函数在等我完成任务吗?\n");
        pthread_exit(NULL);
}

void thread_create(void)
{
        int temp;
        memset(&thread, 0, sizeof(thread));          //comment1
        //创建线程
        if((temp = pthread_create(&thread[0], NULL, thread1, NULL)) != 0)       //comment2
                printf("线程1创建失败!\n");
        else
                printf("线程1被创建\n");

        if((temp = pthread_create(&thread[1], NULL, thread2, NULL)) != 0)  //comment3
                printf("线程2创建失败");
        else
                printf("线程2被创建\n");
}

void thread_wait(void)
{
        //等待线程结束
        if(thread[0] !=0) {                   //comment4
                pthread_join(thread[0],NULL);
                printf("线程1已经结束\n");
        }
        if(thread[1] !=0) {                //comment5
                pthread_join(thread[1],NULL);
                printf("线程2已经结束\n");
        }
}

int main()
{
        //用默认属性初始化互斥锁
        pthread_mutex_init(&mut,NULL);

        printf("我是主函数哦,我正在创建线程,呵呵\n");
        thread_create();
        printf("我是主函数哦,我正在等待线程完成任务阿,呵呵\n");
        thread_wait();

        return 0;
}

2. [代码]编译和运行     跳至 [1] [2] [全屏预览]

gcc -lpthread -o thread_example thread_example.c
./thread_example


开源中国-程序员在线工具:Git代码托管 API文档大全(120+) JS在线编辑演示 二维码 更多»

发表评论 回到顶部 网友评论(12)

  • 1楼:醉若初 发表于 2010-12-07 14:24 回复此评论
    有问题吧!
  • 2楼:SodaGreen 发表于 2010-12-24 20:53 回复此评论
    这么声明void thread_create( void )
    却这么调用pthread_create(& thread [1], NULL, thread2, NULL)
    这没问题?
  • 3楼:LoveJJ2011 发表于 2011-08-05 17:13 回复此评论
    楼主 我想循环的创建自定义个数的pthread  能不能给个建议,重要的是自定义中三个字
  • 4楼:cat_chen 发表于 2011-12-08 20:49 回复此评论
    类似问题不如用生产者消——费者模型(信号量机制方案)来得好
  • 5楼:牧北 发表于 2011-12-08 23:24 回复此评论

    引用来自“SodaGreen”的评论

    这么声明void thread_create( void )
    却这么调用pthread_create(& thread [1], NULL, thread2, NULL)
    这没问题?
    应该没问题,两函数返回值及参数不同,系统应该能辨别。
  • 6楼:金玉清 发表于 2012-03-04 19:21 回复此评论
     打印一下I的值,把printf改一下:
    printf("thread1 :(%d) number = %d\n",i,number);
    printf("thread2 :(%d) number = %d\n",i,number);
    以下是结果:
    thread1 : I'm thread 1
    thread1 :(0) number = 0
    thread2 : I'm thread 2
    thread2 :(0) number = 1
    thread1 :(1) number = 2
    thread2 :(2) number = 3
    thread1 :(3) number = 4
    thread2 :(4) number = 5
    thread1 :(5) number = 6
    thread1 :(6) number = 7
    thread2 :(7) number = 8
    thread1 :(8) number = 9
    thread2 :(9) number = 10

    应该也对i这个全局变量,也加一把锁哈。。。。
  • 7楼:wallwind 发表于 2012-03-05 12:06 回复此评论

    标准生命似乎void* thread(void* );

  • 8楼:G0561 发表于 2012-03-10 19:59 回复此评论

    以前刚学在windows下写过,现在很久没用了,都忘记了,感觉首先还是要熟悉多线程的基本理论吧,这个是首要,楼主辛苦了

  • 9楼:tsuibin 发表于 2012-03-14 14:14 回复此评论
    这个程序有bug
    void thread_wait(void)
    69
    {
    70
            //等待线程结束
    71
            if(thread[0] !=0) {                   //comment4
    72
                    pthread_join(thread[0],NULL);
    73
                    printf("线程1已经结束\n");
    74
            }
    75
            if(thread[1] !=0) {                //comment5
    76
                    pthread_join(thread[1],NULL);
    77
                    printf("线程2已经结束\n");
    78
            }
    79
    }

    thread[0] 不退出,thread[1]就无法join
  • 10楼:秋风2012 发表于 2012-08-19 14:21 回复此评论

    引用来自“SodaGreen”的评论

    这么声明void thread_create( void )
    却这么调用pthread_create(& thread [1], NULL, thread2, NULL)
    这没问题?
    函数名都不相同 有问题?
  • 11楼:七液 发表于 2012-11-07 17:17 回复此评论

    引用来自“cat_chen”的评论

    类似问题不如用生产者消——费者模型(信号量机制方案)来得好
    自己实现时间片拆分的分时系统连等待信号都省了。岂不是更快? 考虑一下Erlang底层是如何做到的。你就明白了 我们现在服务器级的多线程开发的思路全部都是错的
  • 12楼:赵云30 发表于 2013-11-02 13:18 回复此评论

    引用来自“七液”的评论

    引用来自“cat_chen”的评论

    类似问题不如用生产者消——费者模型(信号量机制方案)来得好
    自己实现时间片拆分的分时系统连等待信号都省了。岂不是更快? 考虑一下Erlang底层是如何做到的。你就明白了 我们现在服务器级的多线程开发的思路全部都是错的
    多线程向来问题多,不过Erlang能好到哪去呢? 要这么说,没准哪天C++程序员要跑出来说erlang也是错的,改用我这个boost线程库,Java也跑出来说你们都不行,我得线程库设计的最好,你该怎么想呢、
开源从代码分享开始 分享代码