Linux多线程编程 - sleep 和 pthread_cond_timedwait

#include <stdio.h> #include <stdlib.h>

int flag = 1; void * thr_fn(void * arg) {   while (flag){     printf("******\n");     sleep(10);   }   printf("sleep test thread exit\n"); }   int main() {   pthread_t thread;   if (0 != pthread_create(&thread, NULL, thr_fn, NULL)) {     printf("error when create pthread,%d\n", errno);     return 1;   }     char c ;   while ((c = getchar()) != ‘q‘);     printf("Now terminate the thread!\n");   flag = 0;   printf("Wait for thread to exit\n");   pthread_join(thread, NULL);   printf("Bye\n");   return 0; }

输入q后,需要等线程从sleep中醒来(由挂起状态变为运行状态),即最坏情况要等10s,线程才会被join。采用sleep的缺点:不能及时唤醒线程。

采用pthread_cond_timedwait函数,条件到了,线程即会被join,可及时唤醒线程。实现的如下:


#include <stdio.h> #include <sys/time.h> #include <unistd.h> #include <pthread.h> #include <errno.h>   static pthread_t thread; static pthread_cond_t cond; static pthread_mutex_t mutex; static int flag = 1;   void * thr_fn(void * arg) {   struct timeval now;   struct timespec outtime;   pthread_mutex_lock(&mutex);   while (flag) {     printf("*****\n");     gettimeofday(&now, NULL);     outtime.tv_sec = now.tv_sec + 5;     outtime.tv_nsec = now.tv_usec * 1000;     pthread_cond_timedwait(&cond, &mutex, &outtime);   }   pthread_mutex_unlock(&mutex);   printf("cond thread exit\n"); }   int main(void) {   pthread_mutex_init(&mutex, NULL);   pthread_cond_init(&cond, NULL);   if (0 != pthread_create(&thread, NULL, thr_fn, NULL)) {     printf("error when create pthread,%d\n", errno);     return 1;   }   char c ;   while ((c = getchar()) != ‘q‘);   printf("Now terminate the thread!\n");

pthread_mutex_lock(&mutex);   flag = 0;   pthread_cond_signal(&cond);   pthread_mutex_unlock(&mutex);   printf("Wait for thread to exit\n");   pthread_join(thread, NULL);   printf("Bye\n");   return 0; }

pthread_cond_timedwait()函数阻塞住调用该函数的线程,等待由cond指定的条件被触发(pthread_cond_broadcast() or pthread_cond_signal())。

  当pthread_cond_timedwait()被调用时,调用线程必须已经锁住了mutex。函数pthread_cond_timedwait()会对mutex进行【解锁和执行对条件的等待】(原子操作)。

时间: 2024-10-10 05:12:45

Linux多线程编程 - sleep 和 pthread_cond_timedwait的相关文章

Linux多线程编程小结

 Linux多线程编程小结 前一段时间由于开题的事情一直耽搁了我搞Linux的进度,搞的我之前学的东西都遗忘了,非常烦躁的说,如今抽个时间把之前所学的做个小节.文章内容主要总结于<Linux程序设计第3版>. 1.Linux进程与线程 Linux进程创建一个新线程时,线程将拥有自己的栈(由于线程有自己的局部变量),但与它的创建者共享全局变量.文件描写叙述符.信号句柄和当前文件夹状态. Linux通过fork创建子进程与创建线程之间是有差别的:fork创建出该进程的一份拷贝,这个新进程拥有自己的

Linux多线程编程详解 [By: HarryAlex]

本文内容主要参考于<Linux程序设计·第3版>.<Linux环境C程序设计>.<C语言核心技术>.<深入理解计算机系统·第2版>,代码运行环境: Linux version 3.10.0-123.el7.x86_64 ([email protected]) (gcc version 4.8.2 20140120 (Red Hat 4.8.2-16) (GCC) ) #1 SMP Thu Jun 4 17:17:49 CST 2015 1. Linux进程与

《Linux多线程编程手册》读书笔记

第二章 基本线程编程 1.(P25)如果多个线程等待同一个线程终止,则所有等待线程将一直等到目标线程终止.然后,一个等待线程成功返回,其余的等待线程将失败并返回ESRCH错误. 2.(P26)将新线程的pbe参数作为栈参数进行传递.这个线程参数之所以能够作为栈参数传递,是因为主线程会等待辅助线程终止.不过,首选方法是使用malloc从堆分配存储,而不是传递指向线程栈存储的地址.如果将该参数作为地址传递到线程栈存储,则该地址可能无效或者在线程终止时会被重新分配. 3.(P28)pthread_de

Linux多线程编程-互斥锁

互斥锁 多线程编程中,(多线程编程)可以用互斥锁(也称互斥量)可以用来保护关键代码段,以确保其独占式的访问,这有点像二进制信号量.POSIX互斥锁相关函数主要有以下5个: #include <pthread.h> int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr); int pthread_mutex_destroy(pthread_mutex_t *mutex); int p

Linux多线程编程-条件变量

条件变量 如果说线程间的互斥锁是用来同步共享数据的访问的话,那么条件变量是用于线程之间共享数据的值.条件变量提供了一种线程之间的通知机制,当某个共享数据达到某个值时,唤醒等待这个共享数据的线程.条件变量相关函数主要 有5个: #include <pthread.h> int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *cond_attr); int pthread_cond_destroy(pthread_

Linux多线程编程初探

Linux 线程介绍 进程与线程 典型的UNIX/Linux进程可以看成只有一个控制线程:一个进程在同一时刻只做一件事情.有了多个控制线程后,在程序设计时可以把进程设计成在同一时刻做不止一件事,每个线程各自处理独立的任务. 进程是程序执行时的一个实例,是担当分配系统资源(CPU时间.内存等)的基本单位.在面向线程设计的系统中,进程本身不是基本运行单位,而是线程的容器.程序本身只是指令.数据及其组织形式的描述,进程才是程序(那些指令和数据)的真正运行实例. 线程是操作系统能够进行运算调度的最小单位

Linux多线程编程和Linux 2.6下的NPTL

Linux多线程编程和Linux 2.6下的NPTL 在Linux 上,从内核角度而言,基本没有什么线程和进程的区别--大家都是进程.一个进程的多个线程只是多个特殊的进程他们虽然有各自的进程描述结构,却共享了同一 个代码上下文.在Linux上,这样的进程称为轻量级进程Light weight process.致此,就是关于线程的总体概念了,我们往往就在了解这个概念的情况下开始我们的多线程编程之旅.这对于多线程编程入门已经足够了,然而事 实上线程却要复杂的多. 首先多线程间的优先级调度,内存资源(

Linux——多线程编程

#include<pthread.h>linux 多线程编程: pthread_t 线程名 pthread_create(pthread * thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);) 创建线程 pthread_exit(void *retval) 结束线程 retval存放线程退出状态 pthread_join(pthread_t thread, void** retval)

Linux多线程编程(不限Linux)

前言 线程?为什么有了进程还需要线程呢,他们有什么区别?使用线程有什么优势呢?还有多线程编程的一些细节问题,如线程之间怎样同步.互斥,这些东西将在本文中介绍.我在某QQ群里见到这样一道面试题: 是否熟悉POSIX多线程编程技术?如熟悉,编写程序完成如下功能: 1)有一int型全局变量g_Flag初始值为0: 2) 在主线称中起动线程1,打印"this is thread1",并将g_Flag设置为1 3) 在主线称中启动线程2,打印"this is thread2"