C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 我需要实现一种睡眠方式,直到它有工作要做大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
好的,所以这个问题不在于线程管理…好吧,我正在寻找与此配置不同的解决方案.我有几个想法,但正在寻找可以解决问题的任何解决方案.并将权衡利弊来实施最好的利弊.

这是情况.

我有一个经理应用程序将产生一个线程.该线程将连续运行并处理通过USB连接到系统的电路板的串行通信.管理应用程序便于在系统上运行的其他应用程序和此线程之间的通信.线程需要真正执行两件事情:

>通过串行在可变定时器上投票取样数据通常大约每分钟一次(串行总线相当慢,波特率为4800.我无法控制)
>促进与经理申请沟通. (即其他应用程序将请求样本数据,管理员将请求转发给线程,线程执行操作并返回数据)

我的初始设计是一个简单的设计和作品.我使用一个队列和一个互斥为管理器进行线程通信.所以线程的逻辑如下:

>初始化
>虽然我们还没有收到来自经理的关机命令
>如果我们的定时器已经启动,请轮询主板以获取数据
>否则,检查我们是否有一个管理员发布到队列的消息.如果是这样,处理它

问题是我没有考虑cpu利用率. 99.9%的时间我的线程正在处理任何东西,只是吸取力量.我需要实现一种睡眠方式,直到有工作要做.所以有几个想法:

Pro:完全是我需要的功能.

Con:对于你共享内存的线程来说,这个socket是不是有很大的处理能力呢?

Pro:使用共享内存保持当前的实现

Con:不知道如何实现.有没有像select()这样的函数,而不是使用fds?

Pro:仍然分享内存

Con:可能需要将定时器处理移动到管理器,并且确实不是一个选项,因为它具有其他定时器和执行关键工作.

请推荐并自由批评.我可以接受任何有效的选择.请注意,这是在嵌入式系统上运行,因此资源使用至关重要.

解决方法

尝试这样的事情,使用信号量:
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>

static sem_t s_sem;
static int iAlive = 1;

void* thFunc(void *param)
{
    printf("%s : ENTER \n",__FUNCTION__);
    while(iAlive)
    {
        printf("%s : waiting \n",__FUNCTION__);
        sem_wait(&s_sem);

        printf("%s : got a signal - doing something \n",__FUNCTION__);
        sleep(1);
    }

    printf("%s : EXIT \n",__FUNCTION__);
    return 0;
}

int main()
{
    pthread_t thread;
    sem_init(&s_sem,0);

    if(0 != pthread_create(&thread,NULL,thFunc,NULL))
    {
        printf("%s : pthread_create Failed \n",__FUNCTION__);
        return -1;
    }

    while ( getchar() != 'q' )
    {
        printf("%s : sending signal \n",__FUNCTION__);
        sem_post(&s_sem);
    }

    iAlive = 0;
    sem_post(&s_sem);
    pthread_join(thread,NULL);
    sem_destroy(&s_sem);

    return 0;
}

如果需要超时,可以使用sem_timedwait替换sem_wait.

大佬总结

以上是大佬教程为你收集整理的c – 我需要实现一种睡眠方式,直到它有工作要做全部内容,希望文章能够帮你解决c – 我需要实现一种睡眠方式,直到它有工作要做所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: