错误检查:
- 传统的一些函数是,成功返回0,失败返回-1,并且对全局变量errno赋值以指示错误 。
- pthreads函数出错时不会设置全局变量errno(而大部分其他POSIX函数会这样做,不然这个全局变量就成为临界资源了) 。而是将错误代码通过返回值返回 。
- pthreads同样也提供了线程内的errno变量,以支持其它使用errno的代码 。对于pthreads函数的错误,建议通过返回值判定 , 因为读取返回值要比读取线程内的errno变量的开销更小 。
由于pthread_create的错误码不保存在errno当中,因此不能直接使用perror()打印错误信息,可以先用strerror()把错误码转成错误信息再打印 。
代码示例:
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<pthread.h> //线程调度之后执行的任务 void *fun(void *arg) { printf("新的线程执行任务 tid:%ld\n",pthread_self()); //退出当前函数体 return NULL; }int main(){ int ret = -1; pthread_t tid = -1; //创建一个线程 ret = pthread_create(&tid,NULL,fun,NULL); if(0!=ret) { //根据错误号打印错误信息 printf("error information:%s\n",strerror(ret)); return 1; } printf("main thread.....tid:%lud\n",pthread_self()); return 0;}运行结果如下:

文章插图
线程在创建过程中不会阻塞 , 主进程会立刻执行,那么存在一个问题 , 主进程如果执行完毕 , 那么所有线程都将被释放,就可能出现线程还未调度的问题 。(后面会解决)
线程和进程有区别,父子进程执行的代码段是一样的,但是线程被创建之后执行的是线程处理函数 。
再介绍一个函数:
就像每个进程都有一个进程号一样,每个线程也有一个线程号 。进程号再整个系统中是唯一的,但是线程号不同,线程号只在它所属的进程环境中有效 。
进程号用pid_t数据类型表示,是一个非负整数 。线程号则用pthread_t数据类型来表示,Linux使用无符号长整型数表示 。
实例1: 创建一个线程,观察代码运行效果和函数用法
pthread_t pthread_self(void);功能:获取线程号参数:无返回值:调用线程的线程ID#include <stdio.h>#include <pthread.h>#include <unistd.h>void* pthreadrun(void* arg){ char* name = (char*)arg; while (1){printf("%s is running...\n", name);sleep(1); }}int main(){ pthread_t pthread; // 创建新线程 pthread_create(&pthread, NULL, pthreadrun, (void*)"new thread"); while (1){printf("main thread is running...\n");sleep(1); } return 0;}运行结果如下:

文章插图
实例2: 创建4个线程,然后打印出各自的pid和线程id
#include <stdio.h>#include <pthread.h>#include <unistd.h>void* pthreadrun(void* arg){ long id = (long)arg; while (1){ printf("threaad %ld is running, pid is %d, thread id is %p\n", id, getpid(), pthread_self()); sleep(1); }}int main(){ pthread_t pthread[5]; int i = 0; for (; i < 5; ++i) { // 创建新线程 pthread_create(pthread+i, NULL, pthreadrun, (void*)i); } while (1){ printf("main thread is running, pid is %d, thread id is %p\n", getpid(), pthread_self()); sleep(1); } return 0;}
推荐阅读
- 1斤等于多少磅 一斤等于多少磅
- 荣耀v40屏幕材质_荣耀v40屏幕多大
- 香奈儿山茶花洗面奶味道不一样了_香奈儿洗面奶味道变了
- 怎样快速赚钱(期货1万一年挣1亿)
- Kotlin Mockito使用方法
- 一文理解Cookie、Session
- 一 网络安全:信息收集之玩转nmap(理论篇)
- 荣耀50多久上市_荣耀50什么时候上市
- 华为nova8安兔兔跑分_华为nova8跑分多少
- 天玑1100相当于骁龙多少处理器_天玑1100相当于骁龙什么水平