linux程序设计——同时执行的线程(第十二章)
2015-07-05 13:57
525 查看
12.4 同时执行
接下来编写一个程序来验证两个线程的执行是同时执行的(当然,如果是在一个单处理器系统上,线程的同时执行就需要靠CPU在线程之间的快速切换来实现).这个程序中,在两个线程之间使用轮询技术,所以效率很低,同时程序还有利用这一事实,即除局部变量之外,所有其他变量都将在一个进程中的所有线程之间共享.编写程序thread2.c,在thread1.c上增加了另外一个文件范围变量来测试哪个线程正在执行.
/************************************************************************* > File Name: thread2.c > Description: thread2.c函数在thread1.c的基础上,增加了一个文件范围变量run_now来测试哪个线程正在运行 > Author: Liubingbing > Created Time: 2015年07月05日 星期日 13时06分35秒 > Other: thread2.c程序是在两个线程之间使用轮询技术,因此它的效率很低 thread2.c中每个线程通过设置run_now变量的方法来通知另一个线程开始运行,然后,它会等待另一个线程改变这个变量的值后再次运行. 这个例子显示了两个线程之间自动交替执行,同时,两个线程共享run_now变量. ************************************************************************/ #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <pthread.h> void *thread_function(void *arg); char message[] = "hello world"; int run_now = 1; int main(){ int res; pthread_t a_thread; void *thread_result; int print_count1 = 0; res = pthread_create(&a_thread, NULL, thread_function, (void *)message); if (res != 0){ perror("Thread creation failed"); exit(EXIT_FAILURE); } while(print_count1 < 20){ if (run_now == 1){ printf("1"); run_now = 2; }else{ sleep(1); } print_count1++; } printf("\nWaiting for thread to finish...\n"); res = pthread_join(a_thread, &thread_result); if (res != 0){ perror("Thread join failed"); exit(EXIT_FAILURE); } printf("Thread joined\n"); exit(EXIT_SUCCESS); } void *thread_function(void *arg){ int print_count2 = 0; while (print_count2 < 20){ if (run_now == 2){ printf("2"); run_now = 1; }else{ sleep(1); } print_count2++; } sleep(3); }编译后运行后结果如下所示:
在main中设置run_now为1,在执行新线程时将其设置为2,在while循环中不断地来检查等待它的值,这种方式称为忙等待.运行的结果说明两个线程之间自动交替执行.
相关文章推荐
- 经验分享:在mint-linux 下进行 PHP源代码编译
- linux设备驱动程序之并发和竞态(二)
- linux md5sum用法
- Linux 下的soket编程
- linux下如何模拟按键输入和模拟鼠标?
- Mac/UNIX/Linux关机、休眠、重启命令
- Linux字符界面下的鼠标操作
- Linux下配置部署Jboss
- .NET跨平台:在Linux上基于ASP.NET 5用EF7生成数据库
- Linux删除乱码文件或者目录
- Linux删除乱码文件或者目录
- Linux在什么样的从脚本文件数据库sh格式改变sql格式
- 【Linux知识】server性能测试--UnixBench
- 什么是LAMP
- linux程序设计——第一个线程程序(第十二章)
- CentOS下搭建DNS服务器
- Linux命令-工作管理命令:&,ctrl+z,jobs,fg,bg
- 磁盘配额、例行性工作、系统服务-(Linux笔记)
- 工作管理、进程管理-(Linux笔记)
- Linux中三种SCSI target的介绍之各个target的优劣