Linux--线程编程
可以对进程的内存空间和资源进行访问,并与同一进程中的其他线程共享
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <pthread.h> 4 5int main(){ 6 pthread_t thread_id; 7 8 thread_id=pthread_self(); // 返回调用线程的线程ID 9 printf("Thread ID: %lu.\n",thread_id);1011if (pthread_equal(thread_id,pthread_self())) {12// if (thread_id==0) {13 printf("Equal!\n");14 } else {15 printf("Not equal!\n");16 }17return0;18 }
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <pthread.h> 4 5void *thrd_func(void *arg); 6 pthread_t tid; 7 8int main(){ 9// 创建线程tid,且线程函数由thrd_func指向,是thrd_func的入口点,即马上执行此线程函数10if (pthread_create(&tid,NULL,thrd_func,NULL)!=0) {11 printf("Create thread error!\n");12 exit(1);13 }1415 printf("TID in pthread_create function: %u.\n",tid);16 printf("Main process: PID: %d,TID: %u.\n",getpid(),pthread_self()); 1718 sleep(1); //race1920return0;21 }2223void *thrd_func(void *arg){24// printf("I am new thread!\n");25 printf("New process: PID: %d,TID: %u.\n",getpid(),pthread_self()); //why pthread_self26 printf("New process: PID: %d,TID: %u.\n",getpid(),tid); //why pthread_self2728 pthread_exit(NULL); //退出线程29// return ((void *)0);30 }
使调用进程终止,所有线程都终止了
等待线程
ㄠ蹵N个进程中的多个线程是共享数据段的,通常在线程退出之后,退出线程所占用的资源并不会随着线程的终止而得到释放
瀠琀栀爀攀愀搀开樀漀椀渀()函数
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <pthread.h> 4 5void *thrd_func1(void *arg); 6void *thrd_func2(void *arg); 7 8int main(){ 9 pthread_t tid1,tid2;10void *tret;11// 创建线程tid1,线程函数thrd_func112if (pthread_create(&tid1,NULL,thrd_func1,NULL)!=0) {13 printf("Create thread 1 error!\n");14 exit(1);15 }16// 创建线程tid2,线程函数thrd_func217if (pthread_create(&tid2,NULL,thrd_func2,NULL)!=0) {18 printf("Create thread 2 error!\n");19 exit(1);20 }21// 等待线程tid1结束,线程函数返回值放在tret中22if (pthread_join(tid1,&tret)!=0){23 printf("Join thread 1 error!\n");24 exit(1);25 }2627 printf("Thread 1 exit code: %d.\n",(int *)tret);28// 等待tid2结束,线程函数返回值放在tret中29if (pthread_join(tid2,&tret)!=0){30 printf("Join thread 2 error!\n");31 exit(1);32 }3334 printf("Thread 2 exit code: %d.\n",(int *)tret);3536return0;37 }3839void *thrd_func1(void *arg){40 printf("Thread 1 returning!\n");41// sleep(3);42return ((void *)1); // 自动退出线程43 }4445void *thrd_func2(void *arg){46 printf("Thread 2 exiting!\n");47 pthread_exit((void *)2); // 线程主动退出,返回(void *)248 }
取消线程
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <pthread.h> 4 5void *thrd_func1(void *arg); 6void *thrd_func2(void *arg); 7 8 pthread_t tid1,tid2; 910int main(){11// 创建线程tid1,线程函数thrd_func112if (pthread_create(&tid1,NULL,thrd_func1,NULL)!=0) {13 printf("Create thread 1 error!\n");14 exit(1);15 }16// 创建线程tid2,线程函数thrd_func217if (pthread_create(&tid2,NULL,thrd_func2,NULL)!=0) {18 printf("Create thread 2 error!\n");19 exit(1);20 }21// 等待线程tid1退出22if (pthread_join(tid1,NULL)!=0){23 printf("Join thread 1 error!\n");24 exit(1);25 }else26 printf("Thread 1 Joined!\n");27// 等待线程tid2退出28if (pthread_join(tid2,NULL)!=0){29 printf("Join thread 2 error!\n");30 exit(1);31 }else32 printf("Thread 2 Joined!\n");3334return0;35 }3637void *thrd_func1(void *arg){38// pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL);39 pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL); // 设置其他线程可以cancel掉此线程4041while(1) {42 printf("Thread 1 is running!\n");43 sleep(1);44 }45 pthread_exit((void *)0);46 }4748void *thrd_func2(void *arg){49 printf("Thread 2 is running!\n");50 sleep(5);51if (pthread_cancel(tid1)==0) // 线程tid2向线程tid1发送cancel52 printf("Send Cancel cmd to Thread 1.\n");5354 pthread_exit((void *)0);55 }
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <pthread.h> 4 5#define THREAD_NUM 3 6#define REPEAT_TIMES 5 7#define DELAY 4 8 9void *thrd_func(void *arg);1011int main(){12 pthread_t thread[THREAD_NUM];13int no;14void *tret;1516 srand((int)time(0)); // 初始化随机函数发生器 1718for(no=0;no<THREAD_NUM;no++){19if (pthread_create(&thread[no],NULL,thrd_func,(void*)no)!=0) { // 创建THREAD_NUM个线程,传入(void*)no作为thrd_func的参数20 printf("Create thread %d error!\n",no);21 exit(1);22 } else23 printf("Create thread %d success!\n",no);24 }2526for(no=0;no<THREAD_NUM;no++){27if (pthread_join(thread[no],&tret)!=0){ // 等待thread[no]线程结束,线程函数返回值放在tret中28 printf("Join thread %d error!\n",no);29 exit(1);30 }else31 printf("Join thread %d success!\n",no);32 }3334return0;35 }3637void *thrd_func(void *arg){38int thrd_num=(void*)arg;39int delay_time=0;40int count=0;4142 printf("Thread %d is starting.\n",thrd_num);43for(count=0;count<REPEAT_TIMES;count++) {44 delay_time=(int)(DELAY*(rand()/(double)RAND_MAX))+1;45 sleep(delay_time);46 printf("\tThread %d:job %d delay =%d.\n",thrd_num,count,delay_time);47 }4849 printf("Thread %d is exiting.\n",thrd_num);50 pthread_exit(NULL);51 }
和上一版本的程序差异在于有没有锁,有锁的情况下,必须等"thread x is exiting."之后其他线程才能继续。
eg. 同步各线程,执行顺序为逆序。
转载于:https://blog.51cto.com/boyishachang/1298415
Linux--线程编程相关推荐
- Linux应用编程基础04:Linux线程编程
目录 1. 线程概念与模型 2. 线程实现方式 2.1 内核级线程 2.2 用户级线程 2.3 组合式线程 3. 线程标识 3.1 概念与实现 3.2 相关函数 3.2.1 pthread_equal ...
- 在Linux系统下生产者消费者,Linux线程编程之生产者消费者问题
前言 本文基于顺序循环队列,给出Linux生产者/消费者问题的多线程示例,并讨论编程时需要注意的事项.文中涉及的代码运行环境如下: 本文假定读者已具备线程同步的基础知识. 一 顺序表循环队列 1.1 ...
- 跟我一起做面试题-linux线程编程(2)
如题所述: 子线程循环 10 次,接着主线程循环 100 次,接着又回到子线程循环 10 次,接着再回到主线程又循环 100 次,如此循环50次,试写出代码. -------------------- ...
- Linux线程编程记录
一.进程与线程的区别 1.进程与线程 UNIX/Linux进程可以看成只有一个控制线程:一个进程在同一时刻只做一件事情.有了多个控制线程后,在程序设计时可以把进程设计成在同一时刻做不止一件事,每个线程 ...
- Linux线程编程(三)
3 Resetting scheduling policy for child processes 每个线程都有一个reset-on-fork调度标识.当设置该标识后,使用fork(2)创建的子进程不 ...
- Linux多线程编程---线程间同步(互斥锁、条件变量、信号量和读写锁)
本篇博文转自http://zhangxiaoya.github.io/2015/05/15/multi-thread-of-c-program-language-on-linux/ Linux下提供了 ...
- linux杀死线程函数,Linux线程-pthread_kill
该函数可以用于向指定的线程发送信号: int pthread_kill(pthread_t threadId,int signal); 如果线程内不对信号进行处理,则调用默认的处理程式,如SIGQUI ...
- Linux系统编程——线程私有数据
在多线程程序中.常常要用全局变量来实现多个函数间的数据共享.因为数据空间是共享的,因此全局变量也为全部线程共同拥有. 測试代码例如以下: #include <stdio.h> #inclu ...
- Linux系统编程之进程与线程控制原语对比
Linux系统编程之进程与线程控制原语对比 进程 线程 fork pthread_create exit pthread_exit wait pthread_join kill pthread_can ...
- linux线程并不真正并行,Linux系统编程学习札记(十二)线程1
Linux系统编程学习笔记(十二)线程1 线程1: 线程和进程类似,但是线程之间能够共享更多的信息.一个进程中的所有线程可以共享进程文件描述符和内存. 有了多线程控制,我们可以把我们的程序设计成为在一 ...
最新文章
- java 导出excel 注解_Java基于注解和反射导入导出Excel
- hive查询where join_Hive系列(4):常用函数where,join
- Python3 列表的基本操作
- UI2Code智能生成Flutter代码——版面分析篇
- 如何修改或新增visual studio 的模板
- Mybatis_day2_Mybatis的CRUD操作
- Deepin 添加PPA源问题
- OC category(分类)
- 拓端tecdat|R语言文本主题模型之潜在语义分析(LDA:Latent Dirichlet Allocation)
- 远程桌面总是显示正在配置远程会话_Jump Desktop for mac (远程控制软件)
- 利用Blob进行文件上传的完整步骤
- AndroidTV获取U盘路径
- jeapedu 76 列表刪除一個元素項
- Install Ubuntu18.04.1 and Win7 on A53S
- 22.12.1打卡 漫步校园 记忆化搜索
- 云计算平台项目团队组织架构与缘起
- 2.跳跃游戏(c++)
- 汇编语言中word ptr | byte ptr分别是什么意思
- signature=b8b7708fbcb2dc05aab2f56dfec583f5,ゲームアップデート内容
- 高性能服务器一体机,速度飙升10万倍!华为首推HANA一体机