线程控制:
线程的控制与进程控制不同,由于内核中根本没有写出的概念,因此也就不存在线程相关的“系统调用”,于是大佬在用户层封装了一个线程库,我们就可以在用户层来完成线程的创建,销毁以及其他控制
posix线程库:
- 与线程有关的函数构成了一个完整的系列,绝大多数函数的名字都以“pthread_”开头
- 要使用这些函数库,要提高引入头文件<pthread.h>
- 链接这些线程函数库时要使用编译器的“-lpthread”选项
1.创建线程:
原型:
int pthread_create(pthread_t *thread,const pthread_attr_t *attr,void *(*start_routine)(void*),void *arg);
参数:
- pthread:返回线程ID
- attr:设置线程的属性,attr为NULL表示使用默认属性
- start_routine:是个函数的地址,线程启动后要执行的函数
- arg:传给线程启动函数的参数
返回值:成功返回0,失败返回错误码
错误检测:
- 传统的一些函数是,成功返回0,失败返回-1,并且对全局变量erron复制以指示错误
- pthreads函数出错时,不会设置全局变量errno(而其他大部分POSIX函数会这样做),而是将错误代码通过返回值返回
- pthreads同样提供了线程内的errno变量,以支持其他使用errno的代码,对于pthreads函数的错误,建议通过返回值判定,因为读取返回值要不读取线程内的errno变量的开销小
测试代码:
1 #include<stdio.h>
2 #include<unistd.h>
3 #include<stdlib.h>
4 #include<string.h>
5 #include<pthread.h>
6
7 void *thread_run(void *arg)//线程入口函数
8 {
9 while(1)
10 {
11 printf("I am thread 1\n");
12 sleep(2);
13 }
14 }
15
16 int main()
17 {
18 pthread_t tid;//无符号长整形
19 int ret = pthread_create(&tid,NULL,thread_run,"thread 1");
20 //主线程的执行
21 while(1)
22 {
23 printf("I am main thread\n");
24 sleep(1);
25 }
26 return 0;
27 }
运行结果如下: