线程控制相关函数:#include<pthread.h> 头文件
不是系统调用,posix线程库。
- 创建进程
- 终止进程
- 等待进程
- 线程分离
1.创建进程
函数:
pthread_create(pthread_t *thread, const pthread_attr_t *att, void *(*strart_routine)(void*), void *arg);
参数:
pthread_t *thread:线程ID的地址,新线程的id
const pthread_attr_t *att:是个结构体,设置属性,一般用不到,NULL就好了
void *(*strart_routine)(void*):函数指针,就相当于新线程的入口函数,指定了新线程执行那个代码
void *arg:上个函数指针,入口函数的参数就是这个。
//创建线程 #include <stdio.h> #include <stdlib.h> #include<pthread.h> //头文件 #include <unistd.h> //sleep头文件 void* ThreadEntry(void* arg) { //新线程入口,参数 (void) arg; while (1) { printf("In ThreadEntry\n"); Sleep(1); } } int main() { //创建线程函数:pthread_create(); //pthread_create(pthread_t *thread, const pthread_attr_t *att, void *(*strart_routine)(void*), void *arg); pthread_t tid; pthread_create(&tid, NULL, ThreadEntry, &arg); //创建一个新线程,新线程id tid while (1) { //主线程 printf("In Main Thread\n"); Sleep(1); } system("pause"); return 0; } //Makefile文件中 teat:teat.c gcc $^ -o $@ -lpthread
注意:Makefile 文件中要gcc 那一行中要加上 -lpthread (表示要从pthread库中连接 pthread_create() 函数)
gcc -l 表示连接一个库,直接写 库名就好(不包含 lib 和 .a/.so) -lpthread
另外:线程之间也是抢占式实现的~~~谁先执行不一定~~~
查看线程信息相关操作三种方法:
ps -eLf:查看所有的线程信息(LWP这一列表示线程ID) ps -eLf | grep test
pthread_self():获取自己的线程的ID
注意:ID 结果不一样的,因为所在的角度不一样,ps 得到的线程ID 站在内核角度给PCB 接一个编号;pthread_self() 得到的是站在posix 线程库的角度。
pstack [pid]:查看这个进程<pid>,有多少个线程,以及线程的调用栈也打印出来了,说明线程有自己的调用栈。
gdb:
- gdb attach [pid]:gdb 附加到了进程<pid>上了
- info thread:查看这个进程有几个线程
- thread n:切换到 n 号线程;再bt 就能查看指定线程调用栈