• 多线程编程之pthread_create函数应用


    pthread_create函数

    函数简介

    pthread_create是UNIX环境创建线程函数

    头文件

    #include<pthread.h>

    函数声明

    int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict_attr,void*(*start_rtn)(void*),void *restrict arg);

    返回值

    若成功则返回0,否则返回出错编号

    参数

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

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

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

    最后一个参数是运行函数的参数。

    另外

    在编译时注意加上-lpthread参数,以调用静态链接库。因为pthread并非Linux系统的默认库

    pthread_join函数

    函数简介

    函数pthread_join用来等待一个线程的结束。

    函数原型为:

    extern int pthread_join __P (pthread_t __th, void **__thread_return);

    参数:

    第一个参数为被等待的线程标识符,第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值。这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。如果执行成功,将返回0,如果失败则返回一个错误号。

    例子:

    #include<stdio.h>

    #include<stdlib.h>

    #include<pthread.h>

    struct member

    {

            int num;

            char *name;

    };     

    //结构体后的分号勿漏

    void *create(void *arg)       

    //有void* 型参数传入,不能直接void

    {

            struct member *temp;

            temp=(struct member *)arg;      

    //结构体变量之间不能直接赋值,但可以通过指针赋地址

            printf("member->num:%d\n",temp->num);

            printf("member->name:%s\n",temp->name);

            sleep(1);

            return (void *)8;     

    //这个很有特色,返回一个指向void的数据类型的值,这个值作为后面的exit code

    }

    int main(int agrc,char* argv[])

    {

            pthread_t tidp;

            struct member *b;

            void* a;

            b=(struct member *)malloc(sizeof(struct member));           

    //先分配内存空间撒~

            b->num=1;

            b->name="mlq";              

    //字符串赋值,其他好用简便的方法有:   char *p = NULL;   p = new char [256];

            if((pthread_create(&tidp,NULL,create,(void*)b))==-1)     /

    //

    void *

    为“无类型指针”,void *  可以指向任何类型的数据

            {

                    printf("create error!\n");

                    return 1;

            }

            if(pthread_join(tidp,&a))                   

    //调用

    pthread_join函数,等待线程结束再继续往下执行,要不然主进程和下面的线程并行执行

            {

                    printf("thread is not exit...\n");

                    return -2;

            }

            printf("thread is exit ,code is %d\n",(int)a);       //不知为啥这里是(int)a,,a不是指针来的么

            return 0;

    }

  • 相关阅读:
    五、生产者消费者模型_ThreadLocal
    四、多线程基础-线程池的创建和使用
    spring根据beanName获取bean
    spring容器的功能扩展
    机甲大师S1机器人编程学习,Windows 10 安装Scratch和简单实例学习
    如何建设高可用系统
    详解Condition的await和signal等待/通知机制
    从源码角度彻底理解ReentrantLock(重入锁)
    MySQL 分库分表及其平滑扩容方案
    机甲大师S1机器人编程学习
  • 原文地址:https://www.cnblogs.com/maliqian/p/2290815.html
Copyright © 2020-2023  润新知