Linux下多线程基础编程实例(1)
2013-05-28 09:32
134 查看
实例是在网上看到的,大意如下:
有一个全局变量flag, 在main()函数中创建两个线程,去改变这个全局变量的值,要使得线程2等待线程1退出后再退出;当flag 的值从2变为1的时候,主函数再退出;
其实这个例子不太难,了解一些线程相关的函数。
实验运行结果如下:
其中pid打印的是负数,不符常理,所以可以以无符号的格式输出;
printf("pid = %u \n",pthread_self());就能得到正数的pid了。
有一个全局变量flag, 在main()函数中创建两个线程,去改变这个全局变量的值,要使得线程2等待线程1退出后再退出;当flag 的值从2变为1的时候,主函数再退出;
其实这个例子不太难,了解一些线程相关的函数。
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> void *task1(void *);//线程1执行函数 void *task2(void *); void create_thread();//创建线程函数,把创建的过程都放在函数里 int p1,p2; int flag = 0;//全局变量 pthread_t pid1,pid2; //线程pid pthread_cond_t cond; //线程等待条件 pthread_mutex_t mutex;//线程的互斥信号量 int main() { printf("begin main \n"); usr();//创建两个线程 struct timespec tv; //设置等待超时时间 tv.tv_sec = time(0) + 5; tv.tv_nsec = 0;
pthread_cond_timedwait(&cond,&mutex,&tv);//等待条件满足或者等待时间超时
printf("end main...\n"); return 0; } int usr() { pthread_attr_t attr;// void *p ; int ret = 0; pthread_attr_init(&attr); // pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);//设置为分离的属性
//分离线程,线程执行完退出后,所有资源都要释放,非分离线程,线程必须保留它的线程ID,退出状态直到其他线程调用了pthread_join pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_JOINABLE);//设置线程属性,默认就是非分离的 pthread_create(&pid1, &attr, task1, NULL);
// pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_JOINABLE); pthread_create(&pid2, &attr, task2, NULL); return 1; } void *task1(void *arg1) { int i = 0; printf("begin task1........ \n"); pthread_mutex_lock(&mutex); printf("this is thread 1 pid = %d ,flag = %d\n",(unsigned int )pthread_self(),flag); if(flag == 2) pthread_cond_signal(&cond); flag = 1; printf("in thread 1 flag change = %d \n",flag); pthread_mutex_unlock(&mutex); for(i = 0;i<1000;i++) ; printf("end task 1...."); pthread_exit((void *)1); } void *task2(void *arg2) { int i = 0; pthread_join(pid1,NULL);//等待线程1结束 printf("begin task 2 ........\n"); pthread_mutex_lock(&mutex); printf("this is thread 2 pid = %d ,flag = %d\n",(unsigned int)pthread_self(),flag); if(flag == 1) pthread_cond_signal(&cond); flag = 2; printf("in thread 2 flag change = %d \n",flag); pthread_mutex_unlock(&mutex); printf("end task2.......\n"); pthread_exit((void *)2); }
实验运行结果如下:
其中pid打印的是负数,不符常理,所以可以以无符号的格式输出;
printf("pid = %u \n",pthread_self());就能得到正数的pid了。
相关文章推荐
- LinuxC/C++编程基础(7) boost::mutex的简单实例
- LinuxC/C++编程基础(8) 基于条件变量实现生产者与消费者的实例
- Oracle PL/SQL 编程基础 实例
- LinuxC/C++编程基础(23) 使用thrift/rpc开发简单实例(续1)
- [转]Awk基础入门:Awk实例编程之一
- LinuxC/C++编程基础(32) 使用thrift/rpc开发简单实例(续4)
- Oracle PL/SQL 编程基础 实例 2
- Hadoop那些事儿(四)---MapReduce编程实例(基础)
- Socket通信编程基础__实例一__server端
- STL + c++ + 模板 + 重要思维 + 基础算法+ 经典算法 + 经典实例 + 编程总结+ 心得+ 入门必会 + 知识点汇总。
- LinuxC/C++编程基础(34) 虚函数编程实例
- spring aop切面编程基础实例
- C# 2.0泛型编程基础实例
- Java 编程基础,应用与实例
- Python基础教程之tcp socket编程详解及简单实例
- 网络编程基础(1) : 网路模型简介+同步阻塞实例
- 【Python基础】1.3.1 面向过程编程与面向对象编程(类)实例
- LinuxC/C++编程基础(35) std::istream使用实例
- 实例学习Dreamweaver MX ASP编程基础2
- ORACLE PL/SQL 实例精解之第二章 通用编程语言基础