linux多线程编程,替代sleep的几种方式

linux 内核线程 休眠,线程休眠(sleep, usleep, nanosleep, pthread_delay_np) sleep() 与 usleep()想要延迟数秒的时间, 最佳的方法大概 是使用函式 sleep() . 想要延迟至少数十毫秒的时间 (10 ms 似乎已是最短的延迟时间了), 函式 usleep() 应该可以使用. 这些函式是让出 CPU 的使用权 给其他想要执行的行程 (processes) (``自己休息去了''), 所以没有浪费掉 CPU 的时间. 细节请参考 sleep(3) 与 usl... 阅读详情

我只想要进程的某个线程休眠一段时间的,可是用sleep()是将整个进程都休眠的,这个可能就达不到,我们想要的效果了。 目前我知道有三种方式:

1 usleep

   这个是轻量级的, 听说能可一实现线程休眠, 我个人并不喜欢这种方式,所以我没有验证它的可行信(个人不推荐)。

2 select

   这个可以,我也用过这种方式, 它是在轮询。

3  pthread_cond_timedwait

        采用pthread_cond_timedwait(pthread_cond_t* cond, pthread_mutex_t *mutex, const struct timespec *abstime)可以优雅的解决该问题,设置等待条件变量cond,如果超时,则返回;如果等待到条件变量cond,也返回。本文暂不将内部机理,仅演示一个demo。

       首先,看这段代码,thr_fn为一个线程函数:

#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函数实现的如下:

#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进行【解锁和执行对条件的等待】(原子操作)。这里的原子意味着:解锁和执行条件的等待是原则的,一体的。(In this case, atomically means with respect to the mutex andthe condition variable and other access by threads to those objectsthrough the pthread condition variable interfaces.)

       如果等待条件满足或超时,或线程被取消,调用线程需要在线程继续执行前先自动锁住mutex,如果没有锁住mutex,产生EPERM错误。即,该函数返回时,mutex已经被调用线程锁住。

       等待的时间通过abstime参数(绝对系统时间,过了该时刻就超时)指定,超时则返回ETIMEDOUT错误码。开始等待后,等待时间不受系统时钟改变的影响。

       尽管时间通过秒和纳秒指定,系统时间是毫秒粒度的。需要根据调度和优先级原因,设置的时间长度应该比预想的时间要多或者少点。可以通过使用系统时钟接口gettimeofday()获得timeval结构体。



避免线程使用sleep或usleep等函数导致整个进程休眠的解决方法 然而,使用sleep或usleep等函数时,可能会出现一个问题,即某个线程调用了这些函数后,整个进程都会被休眠,导致其他线程无法执行。总结而言,通过使用定时器来替代sleep或usleep函数,我们可以避免整个进程休眠的问题,提高嵌入式系统的并发性和响应性能。通过使用定时器来替代sleep或usleep函数,我们可以避免整个进程休眠的问题。如果需要执行复杂的任务,建议将其放在其他线程中处理,以保持主循环的快速响应。信号,进程不会休眠,而是被定时器信号唤醒,继续执行下一轮任务。需要注意的是,定时器处理函数。 阅读详情

相关推荐

华为OD机试真题目录汇总(Java语言)2024 B+C+D+E卷 (560道)

本文是2023华为OD机试真题(Java 语言) B卷专栏的目录贴(定期更新2023华为OD各个时间阶段的机试真题,每日定时更新,本专栏将使用Java语言进行更新解答,包含真题,思路分析,代码参考,每个题目的思路分析都非常详细,超过百字欢迎大家订阅学习,代码可以直接运行使用,全网限时最低价,持续更新)华为OD是Outsourcing Dispacth模式,是华为和外企德科联合招聘的简称。目前华为大多数是OD招聘。OD模式也是华为提出的一种新的用工形式,每年都会从OD项目挑优秀员工转为正编。

KJ.JK 8万+

Linux多线程编程替代sleep几种方式

我只想要进程的某个线程休眠一段时间的,可是用sleep()是将整个进程都休眠的,这个可能达不到,我们想要的效果了。目前我知道有三种方式:   1、usleep   这个是轻量级的,听说能可一实现线程休眠,我个人并不喜欢这种方式,所以我没有验证它的可行信(个人不推荐)。   2、select   这个可以,我也用过这种方式,它是在轮询。   3、pthread_cond_timedwait   采用pthread_cond_timedwait(pthread_cond_t* cond, pthread_mutex_t *mutex, const struct timesp

YOLOv11改进 | 细节涨点篇 | DySample一种最新的轻量化动态上采样算子(效果完爆CARAFE)

本文给大家带来的最新改进机制是一种号称超轻量级且有效的动态上采样器——DySample。与传统的基于内核的动态上采样器相比,DySample采用了一种基于点采样的方法,相比于以前的基于内核的动态上采样器,DySample具有更少的参数、浮点运算次数、GPU内存和延迟。此外,DySample在包括语义分割、目标检测、实例分割、全景分割和单目深度估计在内的五个预测任务中,性能均优于其他上采样器(截至目前最有效的上采样算子),

Snu77的博客 4095

Linux几种定时器的使用

一、定时器 在项目的开发过程中,经常会遇到使用定时器的情况。定时器,顾名思意,就是定时定点工作的一种机制。定时器这个东西,无论是在军事、工业甚至是航天飞行的尖端科技上都是必不可缺的。在国人心中大长志气的北斗卫星,其核心也是有一个授时系统,你也可以简单理解成一个定时器(这不太准确,人家那个复杂的多)。 Linux下,由于开源的问题,平台甚多,导致大量的类似或者相近的定时器函数,但其实常用的只有几种,其中有一些在man文档中已经明确指出不建议再使用,当然还有一些高手自己编写了自己的高精度定时器,但弄明白了下面的

fpcc的专栏 2074

linux 用 select 替代 sleep(微秒级)

#include <sys/select.h> #include <sys/time.h> #include <sys/types.h> #include <unistd.h> #include <stdio.h> void local_sleep (long sec, long usec) { struct timeval ...

书山有路勤为径 1333

多线程编程--线程休眠的方式

文章目录线程休眠/组赛`sleep/usleep` 线程休眠/组赛 在线程不满足执行条件时,我们一般希望线程能休眠或者阻塞等待条件满足时再执行;或者,当我们创建新线程时,一般会让新线程阻塞一段时间,防止新线程生命周期过短,返回错误的值。 本文简单介绍了线程休眠的两种方式sleep/usleep方式休眠; pthread_cond_wait()/pthread_cond_timedwai...

ZachZheng的专栏 5498

linux——线程

线程: 线程就是在一个进程中运行的执行流,它是比进程运行更小的运行单位。一个进程可以进行多个线程。 进程的特点是:互不干扰,涉及通信。 线程的特点是:同一进程内的线程相互影响,且不涉及通信。 进程有独立的地址空间,线程没有,同一进程内的线程共享进程的地址空间。 上面我在一个进程内开了三个线程,第一个线程让它打印三次hellowrold!(但是它只打印一次),第二个线程打印l am mohen,...

qq_45166999的博客 314

Linux多线程实例sleep,Linux多线程编程替代sleep几种方式

采用pthread_cond_timedwait函数实现的如下:#include #include #include #include #include static pthread_t thread;static pthread_cond_t cond;static pthread_mutex_t mutex;static int flag = 1;void * thr_fn(void * ar...

weixin_36114355的博客 188

嵌入式 linuxsleep函数到底是线程休眠还是进程休眠

linux下的sleep函数原型为:         unsigned int sleep(unsigned int seconds); 注:线程必须是分离状态哦   使用gcc的库,sleep()函数是以秒为单位的,sleep(1);就是休眠1秒。 而MFC中的Sleep函数原型为:         void Sleep(DWORD dwMilliseco

skdkjxy的专栏 5946

workerman也有定时任务哦

一、下载workerman https://www.workerman.net/download 二、下载workerman/mysql http://doc3.workerman.net/640201 1、定时函数为匿名函数(闭包) use \Workerman\Worker; use \Workerman\Lib\Timer; require_once './Workerma...

谢谢你,慌乱了我的年华 1868

一个 Linux 上分析死锁的简单方法

一个 Linux 上分析死锁的简单方法 于 东海, 宋 波, 和 池 辰 2012 年 8 月 10 日发布 https://www.ibm.com/developerworks/cn/linux/l-cn-deadlock/index.html 简介 死锁 (deallocks): 是指两个或两个以上的进程(线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程(线程)称为死锁进程(线程)。 由

u014426028的博客 810

Linux中的sleep、usleep、nanosleep、poll和select

在进行Linux C/C++编程时,可调用的sleep函数有好多个,那么究竟应当调用哪一个了?下表列出了这几个函数间的异同点,可作为参考:   性质 精准度 线程安全 信号安全   sleep libc库函数 秒 ...

一见 8623

Linux】-- 多线程安全

但有时候,很多变量都需要在线程间共享,这样的变量称为共享变量,可以通过数据的共享,完成线程之间的交互 —— 此时,因为其中的一些特性。于是可以保证加锁的线程,可以将锁带走,因为加锁后,锁就是该线程的上下文数据。于是,有一个人早饭一过就开始等,下午饭时间一到,立马将餐盘一抢,开始打饭,但是这个人很奇怪,每次打几粒米,然后吃完,将餐盘拿到厨房。前面的学习使得我们知道,之所以出现数据不一致问题是因为,一个线程将一个共享数据拿走了,但是没来的及改变共享数据的数值,就被切换成了新的线程来使用这个共享数据。

weixin_64609308的博客 1258

精确时间 Sleep替代函数

获取时间函数有:GetTickCount(),C(OleDate)Time::GetCurrentTime()等要获取高精度时间,可以使用    BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency)//获取系统的计数器的频率    BOOL QueryPerformanceCounter(LARGE_INTEGER *

denglei265的专栏 2365

linux多线程时序问题,Linux时序竞态问题(sleep函数的实现)

时序竞态是指同样的程序,多次调用运行的结果不同,这是由于争夺系统资源所造成的。比如说我们要使用alarm和pause函数来实现一个sleep的功能,那么由于alarm函数的实现过程并不是一个原子操作,那么随时可能被中断。比如说alarm了1秒,在这个过程中,进程失去了CPU,然后当该进程再次获得CPU的时候可能这个时间已经大于1秒了,那么对于alarm来说就已经发出了SIGALRM信号。此时往下继...

weixin_39673051的博客 289

linux多线程编程软件,Linux多线程编程替代sleep几种方式

*FO1?q8mutDA0我只想要进程的某个线程休眠一段时间的,可是用sleep()是将整个进程都休眠的,这个可能就达不到,我们想要的效果了。目前我知道有三种方式:7zK8]$iK*H?2P1]w0hGl&AL"yN01、usleep51Testing软件测试网%RN3p"T&pOI5nCSw{0这个是轻量级的,听说能可一实现线程休眠,我个人并不喜欢这种方式,所以我没有验证它的可行...

weixin_28788593的博客 397

linux中诡异的死了sleep函数-原来是printf函数在作怪~

问题是这样的:#include int main(){while(1) { sleep(1); printf("hello/n"); } return 0;} 运行成功,每隔一秒输出一个hello并换行~#include int main(){while(1) {

行天下 1474

AUTOSAR网络管理详解.pdf

AUTOSAR网络管理详解

上一篇: Python 代码性能优化技巧
下一篇: 如何成为Emacs高手(像神一样使用编辑器)
horst_hu
博客等级 码龄15年 38粉丝 34原创
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值