当前位置:  技术问答>linux和unix

关于pthread_create()第四个参数的问题

    来源: 互联网  发布时间:2017-01-10

    本文导语:   linux下用C开发多线程程序,Linux系统下的多线程遵循POSIX线程接口,称为pthread。   这是百度百科上的定义:http://baike.baidu.com/view/1797052.htm #include  int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr,...

 linux下用C开发多线程程序,Linux系统下的多线程遵循POSIX线程接口,称为pthread。
  这是百度百科上的定义:http://baike.baidu.com/view/1797052.htm
#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
 由 restrict 修饰的指针是最初唯一对指针所指向的对象进行存取的方法,仅当第二个指针基于第一个时,才能对对象进行存取。对对象的存取都限定于基于由 restrict 修饰的指针表达式中。 由 restrict 修饰的指针主要用于函数形参,或指向由 malloc() 分配的内存空间。restrict 数据类型不改变程序的语义。 编译器能通过作出 restrict 修饰的指针是存取对象的唯一方法的假设,更好地优化某些类型的例程。
  第一个参数为指向线程标识符的指针。
  第二个参数用来设置线程属性。
  第三个参数是线程运行函数的起始地址。
  最后一个参数是运行函数的参数。 

当传递参数时,可以直接通过void *(*start_rtn)(void) 传递,如:

#include
#include
void* foo(int *a,int *b)
{


printf("pthread :%dn",++*a);
printf("pthread :%dn",++*b);

}

int main()
{

int a=0;
int b=0;
pthread_t tid;
int err;
err=pthread_create(&tid,NULL,foo(&a,&b),NULL);
foo(&a,&b);
return 0;
}


unix中的说:
如果需要向start_rtn函数传递的参数不止一个,那么需要把这些参数放到一个结构中,然后把这个结构的地址作为arg的参数传入。
上面的函数foo(int *a,int *b); 可以传递2个参数啊!!
问一下,第四个参数void *restrict arg 有啥用? 是运行函数的参数啥意思?

|
参考一下六楼的答案吧。
还有,第三个参数,一般没楼主这么用的吧,一般就是传线程开始执行的那个函数而已。建议楼主多看一下一些别人的代码,然后借鉴一下看别人是怎么用的

|
第三个参数传入的是线程执行函数的地址
第四个可以根据你的具体需要,传入你需要的参数。
6楼的代码有点问题,函数栈里面的地址不能当成参数传给线程创建函数,不然线程执行的时候访问函数栈的空间估计会出错。

|
调用
pthread_create(&tid,NULL,foo(&a,&b),NULL);
的时候
其实是先做
void* Fun = foo(&a,&b);
然后再
pthread_create(&tid,NULL,Fun,NULL);

|
毫无疑问6楼的程序没有问题,关于参数在栈里面,在这里面也没有问题,因为6楼调用了pthread_join函数,主线成会一直等到子线程执行完毕,在子线程执行完毕前,主线程栈不会被释放。

关于楼主的程序的主要执行流程为:
err=pthread_create(&tid,NULL,foo(&a,&b),NULL);
1,先执行一次foo(&a,&b)并获得返回值,在这里很显然返回值是个随机数(大抵就是eax了)
2,这个返回值作为新线程的入口地址(线程入口地址是个随机数哦),参数是NULL,执行新线程
3,段失败错误

|
err=pthread_create(&tid,NULL,foo(&a,&b),NULL);
运行函数 是指的foo这个函数
运行函数的参数 是指的foo的参数,也就是a和b
这里的第四个参数NULL用的好像不太对,应该想办法把&a和&b从这里传进去

|
我来看看,学点知识。

|
象LZ那样应该也可以,把参数从第三个参数传进去,就用不着第四个了

|
foo(&a,&b)
括号里的&a, &b不起作用的, 这儿只需要一个函数的入口地址, 参数传不进去的

编译过不能说明问题.

|
单核的吧, 双核试试...

|


但是参数传递后这个栈并没有消失啊,我觉得没问题,请指教

|

蒽,我也这位差不多理解的,这里的&a,&b是不能传参的,只是作函数的声明,真正要传的参数在后面,如果是一个参数,就把那个变量的地址做最后一个参数,函数传递的参数不止一个,那么需要把这些参数放到一个结构中,然后把这个结构的地址作为arg的参数传入。
这样说应该好理解吧!

|
arg也可以这样用:
#include
#include
void* foo(void *args)
{

int *a, *b;
a = ((void**)args)[0];
b = ((void**)args)[1];
printf("pthread :%dn",++*a);
printf("pthread :%dn",++*b);

}

int main()
{

int a=0;
int b=0;
void *arg[2] = {&a, &b};
pthread_t tid;
int err;
err=pthread_create(&tid,NULL,foo,arg);
pthread_join(tid, NULL);
printf("main: a=%d, b=%dn", a, b);
return 0;
}

|
当传递参数时,可以直接通过void *(*start_rtn)(void) 传递  长见识了

|
你创建的线程的routine是野指针函数。

|
道理很简单,下面这句话其实是先调用了foo这个函数,然后把该函数的返回值传递进去了
之所以编译不报错,那是因为void*在C里面可以隐式转换成其它类型的指针
err=pthread_create(&tid,NULL,foo(&a,&b),NULL);

|
查资料,路过。。。

|
pthread_create第四个参数就是程序传给线程的参数
比如:int i;
pthread_t pid;
pid = pthread_create(&pid, NULL, ThreadProc, (void*)&i);

    
 
 

您可能感兴趣的文章:

  • 请问:linux下如何将一个类的指针作为参数传给pthread_create创建的线程?
  • 有关使用pthread_creat时的参数传递问题!!!
  • pthread_creat 中 传另一个函数 的 参数 问题
  • 请问这段有关pthread_create的参数有问题吗?
  • 请问一下红色字体处的区别,及pthread_self()和pthread_creat()函数第一个参数的区别?
  • pthread_create函数执行问题
  • 关于pthread_create函数的问题
  • pthread_create的问题
  • 无法使用pthread_creat()函数的问题
  • pthread_create 的问题 ,求救大家!!!
  • pthread_create创建线程问题
  • pthread_create函数返回值问题
  • 【紧急】关于pthread_create的问题!!!
  • 再次发布pthread_create问题,认为是内存问题的就别回了,谢谢!
  • linux下pthread_create创建线程问题
  • [请教]pthread_create多线程问题
  • pthread_create 传参简单问题,大家指教。
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 一个pthread_create 编译出错,是什么原因啊
  • Linux里的pthread_create会不会阻塞啊?
  • 为什么pthread_create`编译通不过
  • 包含了#include <pthread.h>,为什么还有pthread_create错误?
  • linux下进程和线程的区别(fork(),pthread_create())?
  • pthread_create函数编译时报错?
  • REDHAT7.2提示:undefined reference to "pthread_create"
  • 请问:为什么我在守护进程里面用pthread_create来启动线程,经常会卡在那里阿?
  • pthread_create 为何报 Segmentation fault?
  • pthread_create编译错误
  • ★pthread_create 与 thr_create的区别是什么?★
  • 求助!!undefined reference to 'pthread_create'
  • 急!同一个c文件里vfork();pthread_create();两个函数,Makefile该怎么写?谢谢
  • 在LINUX GCC 编译错误 UnDefined reference to "pthread_creat"
  • No manual entry for pthread_create,我安了manpages-dev和glibc-doc
  • 为什么pthread_create创建线程出错.有完整代码,哪儿错了,大家给试试.
  • pthread_create传给执行函数的变量能不能有多个?
  • pthread_create所创建的线程中的static变量
  • (.text+0x57): undefined reference to `pthread_create'求解
  • 创建线程函数pthread_create,在c/c++的用法。


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3