本来就线程的创建和终止这两部分应该写在一块的,可是我怕写在一块内容过于庞大,就分开来写,可是线程的创建确实也是没什么好写,主要是线程的id标识问题pthread_creat
int pthread_creat( pthread_t *restrict tidp,
const pthread_attr_t *restrict attr,
void *(*start_rtn)(void),
void *restrict arg);
第一个参数:线程ID
第二个参数:线程属性,一般为NULL
第三个参数:线程函数地址
第四个参数:线程函数参量
至于可能碰到的一些问题,请另见我的博客另一文章
线程标识
进程是有进程标识的,线程当然也有,进程标识用pid_t表示,实际是个unsigned int类型,线程用pthread_t表示,我一直以为也是个unsigned int类型,其实不然。
它是一个非可移植性的类型,也就是说,在这个系统中,可能是unsigned int类型,在别的系统可能是long,double,或者甚至就是个结构体。都不得而知,所以非可移植。
所以,如果是想打印线程ID,那么就必须接受非可移植的事实。
不过关于线程ID,还是提供了一些可以移植性的函数的
1.线程通过调用pthread_self()函数获取自身的线程ID号
pthread_t pthread_self(void);
2.比较两个线程的ID号
int pthread_equal(pthread_t tid1,pthread_t tid2);
相等返回非0,否则返回0
看看想打印线程ID的情况:
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
pthread_t thread_id=NULL;
void printids(const char *s)
{
pid_t pid;
pthread_t tid;
pid = getpid();
tid = pthread_self();
printf("%s pid %u tid %u (0x%x)\n",s,(unsigned int)pid,(unsign ed int)tid,(unsigned int)tid);
}
int gps_proc()
{
printids("new thread:");
return 0;
}
int main( void )
{
int ret;
ret=pthread_create(&thread_id,NULL,(int*)gps_proc,NULL);
if(ret!=0){printf("Create pthread error!\n");return -1;}
printids("main thread:");
sleep(1);
return 0;
}
程序注解:1.到底pthread_self()有什么用?因为我们在pthread_creat()中的第一个参量就是返回线程的ID,而且在同一进程中线程的全局变量是共享的啊,是不是有这个thread_id变量就足够了呢?其实不然,在pthread_creat返回之前,也就是说在thread_id得到值之前,新线程就极其有可能在跑了,那么我们在新线程里面就指望不上这个thread_id了,所以需要pthread_self()
2.为什么主线程要sleep(1),因为线程创建之后,我们不知道到底是哪个线程先跑,想想看,要是主线程先跑,主线程都已经return了,新线程还在跑,那这个新线程就要没人管了,说不定会干出什么事情。
程序结果分析:
main thread:pid 29669 tid 3086833344 (0xb7fd56c0)
new thread:pid 29669 tid 3086830512 (0xb7fd4bb0)
可见tid表示为unsigned int类型并没有什么太大的意义,表示为十六进制的话,可能还有点用,因为pthread_t是个结构体的时候,我们可以把这个值直接认为是十六进制的地址值
哈,到此为止吧,赶着吃饭去了!