pthread_create()创建线程时传入多个參数

因为接口仅仅定义了一个入參void *arg

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

所以,假设想传參数,须要封装结构体。将多个參数通过一个结构体传入线程。

typedef struct
{
    FUNCPTR entry; /* 函数入口*/
    void *arg[10]; /* 參数*/
}FUNC;

void *start(void *arg)
{

    FUNC *func = NULL;

    (*(func->entry))(func->arg[0], func->arg[1], func->arg[2], func->arg[3], func->arg[4],
            func->arg[5], func->arg[6], func->arg[7], func->arg[8], func->arg[9]);
    return NULL;

}

int PTHREAD_CTREATE(pthread_t *tidp,const pthread_attr_t *attr, void *(*funcptr)(void *, void *, void *), unsigned args, ...)
{

    /* 构造函数集合的结构体 */

    FUNC function = {0};

    function.entry = funcptr;

    for (i = 0; i < args; i++)
    {
        func->arg[i] = arg[i];
    }

    //设置线程属性(略)

    pthread_create(NULL, &attr, start, (void *)&function);

    return 0;

}
时间: 2024-10-11 00:26:41

pthread_create()创建线程时传入多个參数的相关文章

pthread_create()创建线程时传入多个参数

由于接口只定义了一个入参void *arg int pthread_create(pthread_t *tidp,const pthread_attr_t *attr, (void*)(*start_rtn)(void*),void *arg); 所以,如果想传参数,需要封装结构体,将多个参数通过一个结构体传入线程. typedef struct { FUNCPTR entry; /* 函数入口*/ void *arg[10]; /* 参数*/ }FUNC; void *start(void *

一起talk C栗子吧(第一百三十四回:C语言实例--创建线程时的内存细节)

各位看官们,大家好,上一回中咱们说的是"创建进程时的内存细节"的例子,这一回咱们说的例子是:创建线程时的内存细节.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在前面章回中介绍过创建线程的例子,创建线程时使用的函数是pthread_create.今天我们一起说一下使用该函数创建线程时内存的一些细节问题.我们介绍的的重点还是内存布局中的四个分区.这点和前一回中介绍创建进程时内存细节的思路相同. 1.在主线程中使用pthread_create函数可以创建一个新线程,我们叫

创建线程时如果既传入了runnable对象,又继承thread重写了run方法,会执行的哪里的代码

1 使用线程的方式,继承thread类,重写run方法 new Thread() { @Override public void run() { System.out.println("我是新的线程"); } }.start(); 重写之后,线程执行的就是我们自己的run方法,而在Thread类中的run方法就不会被执行 这是Thread类的run方法 在这个方法中判断target是否为null,不为null,才执行target的run方法 2  既传入了runnable对象,又继承t

管理线程之创建线程

主要的线程管理包含:1.创建线程.2.等待它结束或在后台执行. 3.向线程函数传递參数.更改线程对象全部权.4.选择线程和使用特定线程. 创建线程 线程在创建线程对象时開始执行,创建线程对象使用std::thread.像上节最后那个函数一样.最简单的情况是线程对象创建后执行一个无返回值.无參数的函数. 这个函数在线程中执行直到返回,这时线程终止. 想一下最复杂的情况,线程执行的函数可能是个函数对象.须要传递參数,执行一系列独立的操作.这些操作须要系统的一些信息,直到接收到某个信号终止. 线程执行

线程间的參数传递

在多线程编程中.经常须要从主线程传递參数给子线程或在主线程中获得子线程的计算结果, 若使用全局变量实现.必定须要对临界区保护,因此导致大量的切换工作造成效率的低下. 而利用进程间的參数传递能够解决这一问题. 两个方向的參数传递: 1.主线程向子线程传递參数: 通过函数 int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg); 在创建线程

在C++的类中,普通成员函数不能作为pthread_create的线程函数,如果要作为pthread_create中的线程函数,必须是static

在C++的类中,普通成员函数不能作为pthread_create的线程函数,如果要作为pthread_create中的线程函数,必须是static ! 在C语言中,我们使用pthread_create创建线程,线程函数是一个全局函数,所以在C++中,创建线程时,也应该使用一个全局函数.static定义的类的成员函数就是一个全局函数. 更多 参考  http://blog.csdn.net/ksn13/article/details/40538083 #include <pthread.h> #

高并发之——从源码角度分析创建线程池究竟有哪些方式

前言 在Java的高并发领域,线程池一直是一个绕不开的话题.有些童鞋一直在使用线程池,但是,对于如何创建线程池仅仅停留在使用Executors工具类的方式,那么,创建线程池究竟存在哪几种方式呢?就让我们一起从创建线程池的源码来深入分析究竟有哪些方式可以创建线程池. 使用Executors工具类创建线程池 在创建线程池时,初学者用的最多的就是Executors 这个工具类,而使用这个工具类创建线程池时非常简单的,不需要关注太多的线程池细节,只需要传入必要的参数即可.Executors 工具类提供了

使用线程池而不是创建线程

在我们开发程序时,若存在耗性能.高并发处理的任务时,我们会想到用多线程来处理.在多线程处理中,有手工创建线程与线程池2种处理方式,手工创建线程存在管理与维护的繁琐..Net线程池能够帮我们完成线程资源的管理工作,使用我们专注业务处理,而不是代码的细微实现.在你创建了过多的任务,线程池也能用列队把无法即使处理的请求保存起来,直至有线程释放出来. 当应用程序开始执行重复的后台任务,且并不需要经常与这些任务交互时,使用.Net线程池管理这些资源将会让性能更佳.我们可以使用ThreadPool.Queu

Java总结(十)—实现Runnable接口创建线程,线程安全同步,死锁(哲学家进餐问题),读写锁

一.通过实现Runnable接口创建线程 定义实现Runnable接口的类 (1)Runnable接口中只有一个方法public void run();用来定义线程运行体: class MyRun implements Runnable(){ public void run(){ 线程执行的具体代码 } } (2)创建线程的实例的时候将这个类的实例作为参数传递到线程实例内部.然后再启动: Thread thread=new Thread(new MyRun()); Thread.start();