pthreadcreate函数(pthread_cancel函数)
多线程pthread_create的参数
C语言使用pthread_create()函数完成多线程的创建,pthread_create()函数共有四个参数。这四个参数分别为:
第一个 参数负责向调用者传递子线程的线程号
第二这个参数负责控制线程的各种属性,这也是线程在创建的时候,最为复杂的一个参数。下面是这个结构体的定义:
在结构体中的第一个参数 detachstate 说明了线程的分离状态。
PTHREAD_CREATE_DETACHED 分离状态:父线程在创建子线程之后,,父线程不会去等待子线程结束再去运行自己接下来的程序;
PTHREAD_CREATE_JOINABLE 状态:父线程会等待子线程运行结束,才继续运行接下来的程序。
注意的是如果当线程一旦处于 PTHREAD_CREATE_DETACHED 状态,那么线程的状态就无法再被修改了。线程创建时默认设置为PTHREAD_CREATE_JOINABLE状态
schedpolicy说明的是线程的调度策略,这个值可以分别被设置为:
SCHED_FIFO: 先进先出
SCHED_RR: 轮转法
SCHED_OTHER: 其他方法
schedparam参数实际上设置的是线程的优先级。这个参数仅当调度策略为实时(即SCHED_RR或SCHED_FIFO)时才有效
这个参数设置线程的调度参数是拷贝父线程的线程调度参数,还是上面的两个参数 schedpolicy 和 schedparam 属性进行设置。
该参数可以被设为:
PTHREAD_INHERIT_SCHED :表示新现成将继承创建线程的调度策略和参数)
PTHREAD_EXPLICIT_SCHED :表示使用在schedpolicy和schedparam属性中显式设置的调度策略和参数
scope参数设置的是线程优先级的使用范围。
PTHREAD_SCOPE_PROCESS 进程级竞争资源
PTHREAD_SCOPE_SYSTEM 系统级竞争资源
这个参数是线程栈的起始地址,这个参数只有在线程栈由自己创建时,才需要设置。当线程栈由用户直接创建,而不是通过系统创建时,线程栈的大小和位置都可以进行修改,但是用户程序需要完成对线程栈空间的释放。在设置该参数之后,guardsize警戒栈缓冲区的大小就变为0,为了防止栈溢出就需要对线程栈的境界栈缓冲区进行设置。
这个参数设置警戒栈缓冲区的大小。警戒栈缓冲区可以保护程序,防止栈溢出对数据造成破坏。
stacksize参数在线程创建之前创建,用来修改创建的线程栈的大小,但是最小不能低于 PTHREAD_STACK_MIN (16384) bytes ,即16k内存大小,也就是4个内存页(4个内存页这一点由内核决定)。
这个参数负责指定子线程需要允许的函数,这个参数需要的是一个函数指针。
这个参数负责指定,子线程所运行的函数的参数值。

pthread_create函数返回1,也就是说创建线程失败了,这是哪里有问题,麻烦各位帮忙一下
我也碰到同样的问题,我把这一行pthread_attr_setinheritsched(attr,PTHREAD_EXPLICIT_SCHED);//注释掉
就好了,而且attr中的属性值也设置到线程里去了。
如果不注释的话,就换成ROOT用户执行,因为修改线程调度策略需要超级用户。
Pthread线程使用详解
文中先讲解函数,再运行实例,以及一些注意事项。
函数 pthread_create ,使用 man 3 pthread_create 查看介绍。
函数描述:
通过 pthread_create 创建的新线程,有收下四种方法退出线程:
attr参数 是一个 pthread_attr_t 结构体,它在线程被创建时被用来设定新线程的属性。这个结构体的初始化是通过 pthread_attr_init() 函数。如果该参数为空,那么新线程会使用默认的属性参数。
在 pthread_create 函数调用返回之前,新线程的内存指针会赋给 thread 参数,表示线程的ID,这个ID的作用是在后续可以调用针对该线程的其它pthreads函数。
返回值
成功返回0,失败返回一个错误编号,同时 thread 参数也不会被赋值。
函数描述
pthread_join 函数会等待指定的线程结束,如果指定的线程已经线束,那么它会立即返回。指定的线程必须是joinable的。也就是说, pthread_join() 函数会 一直阻塞调用线程,直到指定的线程tid终止 。当 pthread_join() 返回之后,应用程序可回收与已终止线程关联的任何数据存储空间 ,(另外也可设置线程attr属性,当线程结束时直接回收资源)如果没有必要等待特定的线程终止之后才进行其他处理,则应当将该线程分离 pthread_detach() 。
如果 retval 不为空,那么该函数会拷贝退出状态值到 retval 指向的内存中,如果目标thread被cancel了, retval 的值为 PTHREAD_CANCELED
返回值
成功返回0,错误返回错误码
linux 下pthread_create函数参数问题
问题出在类型转成指针上,和 tid_num应该没关系。chat 参数应该是一个原型类似于下面的函数的函数:
void * function(void *arg)。 你不应该将chat函数强制转换成 void *