线程使用

一、gcc 编译程序

  • 预处理

    主要处理#include和#define

    把#include包含进来的.h 文件插入到#include所在的位置

    把#define定义的宏用实际的字符串代替

    1
    2
    3
    4
    gcc -E main.c

    gcc -E main.c -o main.i
    //终端不打印,而是输出到main.i的文件中,可以进行查看
  • 编译

    主要检查是否有语法错误

    生成汇编语言

    1
    2
    gcc -S main.i   -o main.s
    //终端打印warning和error
  • 汇编

    生成二进制机器指令文件.o

    1
    2
    gcc -c main.s -o main.o
    //生成二进制文件
  • 链接

    加载库文件

    生成最后的可执行文件

    静态库:编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为”.a”。

    动态库:在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为”.so”,如前面所述的libc.so.6就是动态库。Gcc在编译时默认使用动态库。

    1
    2
    gcc  main.o  -o main
    //将汇编文件生成可执行文件main
  • gcc使用
    1
    2
    gcc main.c -o main
    //相当于直接执行了预编译,编译,汇编,链接四个步骤

二、pthread函数

  • pthread_join()

    函数功能:

    使一个线程等待另一个线程结束

    1
    2
    3
    4
    pthread_t ioThread;
    pthread_create(&ioThread, NULL, &gNB_wls_thread, (void*)pFwCtrlBlk);

    pthread_join(ioThread, NULL);
  • pthread_create()创建线程
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    void* ();
    void* config_slave();

    int main()
    {
    pthread_t pid_master;
    pthread_t pid_slave;

    pthread_create(&pid_master,NULL,config_master,NULL);

    pthread_create(&pid_slave,NULL,config_slave,NULL);
    //注意 create 使用的是&pid
    pthread_join(pid_master,NULL);

    pthread_join(pid_slave,NULL);
    //注意 join 使用的是pid

    printf("main endn");
    }

    void* () //注意是创建的是 指针函数
    {
    printf("master start!n");
    return NULL; //返回的类型是指针类型
    }

    void* config_slave()
    {
    printf("slave start!n");
    return NULL;
    }