>
Linux C语言多线程编程
2020/12/16 15:09:06
Linux
  • 1849
  • 527
  • 64
  • 51

linux下C语言多线程编程实例

多线程编程:

  1. 引用#include<pthread.h>   #引入开启线程的头文件

  2. pthread_create用来创建一个线程,原型为:
          extern int pthread_create __P ((pthread_t *__thread, __const pthread_attr_t *__attr,
      void *(*__start_routine) (void *), void *__arg));

          第一个参数为指向线程标识符的指针;第二个参数用来设置线程属性;

          第三个参数是线程运行函数的起始地址 最后一个参数是运行函数的参数。

  3. 我们的函数thread不需要参数,所以最后一个参数设为空指针。第二个参数我们也设为空指针,这样将生成默认属性的线程。

  4.      函数pthread_join用来等待一个线程的结束。函数原型为:
      extern int pthread_join __P ((pthread_t __th, void **__thread_return));
           第一个参数为被等待的线程标识符;第二个参数为一个用户定义的指针;

  1. 创建一个函数:(first.c)


  2. #include<stdio.h>
    #include <unistd.h>
    void * first(void *arg)
    {
            int i;
            for(i=1;i<=30;i++)
            {
            printf ("Pthread one: %d",i);
            sleep(1);
            }
    }


  3. 创建一个函数成功后 如果要使用必须要声明该函数:这时候就可以使用.h文件来声明函数:

  4. 创建一个自定义头文件 用来声明自己写的函数:

  5.     

 #ifndef__FIRST_H__ 
 #define__FIRST_H__
     void  * first(void *arg);
 #endif
  1. 创建一个主函数main.c


  2. #include<stdio.h>
    #include"first.h"    #这里的""代表的是去找当前目录中的头文件
    #include <pthread.h> #引用创建线程的头文件
    int main(){
    pthread_t thread;
    pthread_create(&thread,NULL,first,NULL);
            return 0;
    }

    函数写完以后  进行编译:

  3. 自定义一个编译文件(makefile)


  4. BJECT = main.o first.o 
    TARGET = test
    ${TARGET}:${OBJECT}
    gcc -o ${TARGET} ${OBJECT}  
    clean:
    rm -f ${TARGET} ${OBJECT}

    这时候执行 输入:make

    main.o: In function `main':

    main.c:(.text+0x1f): undefined reference to `pthread_create'

    会出现报错:

        问题的原因:pthread不是linux下的默认的库,也就是在链接的时候,无法找到phread库中函数的入口地址,链接就会失败 报错

        解决:在gcc编译的时候,附加要加 -lpthread参数即可解决。

    修改后的 makefile文件

OBJECT = main.o first.o
TARGET = test
${TARGET}:${OBJECT}
    gcc -o ${TARGET} -lpthread  ${OBJECT}
clean:
    rm -f ${TARGET} ${OBJECT}

    编译成功就会出现:gcc -o test -lpthread  main.o first.o  

    运行test文件时;发现线程中的函数未输出 就结束主线程了:

    image.png

    为什么会这样呢?

    因为我们开的是一个线程 那么这时候就会重新创建一线程进行运行:

    那么我们要看到线程中的函数输入结果呢 

    这时候就要用到我们前面所讲的的pthread_join 函数  等待这个线程执行完毕:

    那么我们就需要修改这个main.c文件里面的内容啦:

        #include<stdio.h>
    #include"first.h"
    #include <pthread.h>
    int main()
    {
        pthread_t thread;
        pthread_create(&thread,NULL,first,NULL);
        pthread_join(thread,NULL)#等待线程执行完毕
        return 0;
      }

    修改完成以后 那么就需要重新编译 :

    1.先清空原有的编译:make clean

    2.重新生成编译文件:make

image.png

    这时候我们就看见执行文件的时候 并不是立马就结束主线程的

    而是在等待子线程执行完以后才结束主线程:

    子线程结束完毕以后:如下图:

    image.png

    Linux多线程编程就Over 啦

    多线程完美结束:

    




全部留言 ()
返回
顶部