zoukankan      html  css  js  c++  java
  • linux多线程的总结(pthread用法)



    原创:lobbve223  出自: http://www.linuxdiyf.com

    #include
    int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict attr,
    void *(*start_rtn)(void),void *restrict arg);
    Returns: 0 if OK, error number on failure

    第一个参数为指向线程标识符的指针。

    第二个参数用来设置线程属性。

    第三个参数是线程运转函数的肇端地址。

    第四个参数是运转函数的参数。

    当创立线程成功时,函数前往0,若不为0则阐明');创立线程掉败,罕有的错误前往代码为EAGAIN和EINVAL。前者体现系统限制创立新的线程,例如线程数量过多了;后者体现第二个参数代表的线程属性值非法.
    pthread_create的用法:由于pthread库不是Linux系统默许的库,所以在运用pthread_create创立线程时,须要在编译中请加-lpthread参数,eg:gcc -o test -lpthrea test.c

    例1:

    #include "pthread.h"
    #include "stdio.h"
    void* thread_test(void* ptr)
    { while(1)
    printf("i am pthread\n");
    }
    int main()
    {
    pthread_t pid;
    pthread_create(&pid, NULL, test_thread, NULL);
    while(1)
    printf("i am main pthread\n");
    return 0;
    }

    例2:

    #include
    #include
    pthread_t id;
    int ret;
    void thread_1()
    {
    while(1)
    {printf(“I am thread\n”);
    sleep(1);
    }
    }
    main()
    {ret = pthread_create(&id,NULL,(void*)thread_1,NULL);
    if(ret != 0)
    printf("Create pthread error!\n");
    while(1)
    {
    printf(“I am main thread\n”);
    sleep(2);
    }
    }

    例3:

    #include
    #include
    #include
    #include
    void *thread_function(void *arg);
    char message[] = "Hello World";
    int main()
    {
    int res;
    pthread_t a_thread;
    void *thread_result;
    res = pthread_create(&a_thread, NULL, thread_function, (void *)message);
    if (res != 0)
    {
    perror("Thread creation failed");
    exit(EXIT_FAILURE);
    }
    printf("Waiting for thread to finish...\n");
    res = pthread_join(a_thread, &thread_result); //pthread_join 壅塞尝试的线程直到某线程完毕
    if (res != 0)
    {
    perror("Thread join failed");
    exit(EXIT_FAILURE);
    }
    printf("Thread joined, it returned %s\n", (char *)thread_result);
    printf("Message is now %s\n", message);
    exit(EXIT_SUCCESS);
    }
    void *thread_function(void *arg)
    {
    printf("thread_function is running. Argument was %s\n", (char *)arg);
    sleep(3);
    strcpy(message, "Bye!");
    pthread_exit("Thank you for the CPU time");
    }
    [root@plinux tmp]# cc -D_REENTRANT -I/usr/include/nptl thread2.c -o thread2 -L/usr/lib/nptl -lpthread
    [root@plinux tmp]# ./thread2
    thread_function is running. Argument was Hello World
    Waiting for thread to finish...
    Thread joined, it returned Thank you for the CPU time
    Message is now Bye!
    pthread_join()
    void pthread_exit(void *retval)
    int pthread_join(pthread_t pid, void **thread_return)

    pthread_join()的调用者将挂起并等待th线程终止,retval是调用pthread_exit()的线程(线程ID为pid)的前往值,若是thread_return不为NULL,则*thread_return=retval。

    须要看重的是一个线程仅允许独一的另一个线程运用 pthread_join()等待本线程的终止,并且被等待的线程应该处于可join状况,即非DETACHED状况。




    版权声明: 原创作品,允许转载,转载时请务必以超链接情势标明文章 原始出处 、作者信息和本声明。不然将清查法律责任。

  • 相关阅读:
    垃圾回收算法(1)标记-清除
    golang的interface剖析
    库文件的使用
    linux loadavg详解(top cpu load)
    撰写的《大数据处理框架Apache Spark设计与实现》出版了
    VUE文件上传删除、图片上传删除、视频上传删除
    三元运算符
    VScode格式化后单引号变双引号解决办法
    VUE实现分页
    绝望!新手小白在VUE组件之间进行传值上浪费了很多时间~
  • 原文地址:https://www.cnblogs.com/zgqjymx/p/1976017.html
Copyright © 2011-2022 走看看