RK3568平台(基础篇)记一次优化线程提高CPU占有率

一.进程与线程

进程:

进程是操作系统中分配资源的最小单位,每个进程 都拥有独立的内存空间、代码段、数据段、堆栈和文件描述符等资源,进程之间通常需要通过 进程间通信(IPC)机制进行数据交换和协同操作。但是创建和销毁进程的开销较大,而且进 程之间通信的机制比较复杂。

线程:

线程(thread)是进程中的一个执行流程,是操作系统中调度的最小单位,每个线程都共 享同一进程的资源,包括内存空间、文件描述符等。线程之间可以通过共享内存和同步机制进 行数据交换和协同操作,相对于进程,线程的创建和销毁开销较小,可以更加高效地利用系统 资源,提高程序的并发性能和响应能力。

二.线程的创建

使用 pthread_create()函数对线程进行创建,pthread_create()函数使用的头文件和函数原型, 如下所示:

所需头文件:

#include <pthread.h>

函数原型:

int pthread_create(pthread_t *thread, const pthread_attr_t
*attr,void *(*start_routine) (void *), void *arg);

示例:

#include <stdio.h>
#include <pthread.h>

void* print_message(void* str)
{
   printf("%s\n", (char*) str); // 打印传入的字符串
   return NULL;
}

int main()
{
   pthread_t thread_id; // 线程 ID
   char* message = "你好,线程!"; // 传给新线程的字符串指针
   int result;
   result = pthread_create(&thread_id, NULL, print_message, (void*) message);
   // 创建新线程并传入参数
   if (result != 0)
   {
     printf("错误:创建新线程失败。\n"); // 如果创建新线程失败则输出错误信息
     return -1;
   }
     printf("主线程结束。\n"); // 主线程输出信息
   return 0;
}

 三.对线程中的while进行优化

程序原型:不添加延时。

#include <stdio.h>
#include <pthread.h>

void* print_message(void* str)
{
   while(1)
   {
      printf("%s\n", (char*) str); // 打印传入的字符串
   }

   return NULL;
}

int main()
{
   pthread_t thread_id; // 线程 ID
   char* message = "你好,线程!"; // 传给新线程的字符串指针
   int result;
   result = pthread_create(&thread_id, NULL, print_message, (void*) message);
   // 创建新线程并传入参数
   if (result != 0)
   {
     printf("错误:创建新线程失败。\n"); // 如果创建新线程失败则输出错误信息
     return -1;
   }
     printf("主线程结束。\n"); // 主线程输出信息
   return 0;
}

 在不加延时的情况下top的CPU占用率是1.5.

添加延时:usleep(100*1000);

#include <stdio.h>
#include <pthread.h>

void* print_message(void* str)
{
   while(1)
   {
      usleep(100*1000);
      printf("%s\n", (char*) str); // 打印传入的字符串
   }

   return NULL;
}

int main()
{
   pthread_t thread_id; // 线程 ID
   char* message = "你好,线程!"; // 传给新线程的字符串指针
   int result;
   result = pthread_create(&thread_id, NULL, print_message, (void*) message);
   // 创建新线程并传入参数
   if (result != 0)
   {
     printf("错误:创建新线程失败。\n"); // 如果创建新线程失败则输出错误信息
     return -1;
   }
     printf("主线程结束。\n"); // 主线程输出信息
   return 0;
}

在添加延时usleep(100*1000)的情况下top的CPU占用率是0.6.

四.疯狂创建线程是不允许的

程序原型:

#include <stdio.h>
#include <pthread.h>

void* print_message(void* str)
{
      printf("%s\n", (char*) str); // 打印传入的字符串

   return NULL;
}

int main()
{
   pthread_t thread_id; // 线程 ID
   char* message = "你好,线程!"; // 传给新线程的字符串指针
   int result;

   while(1)
   {
      result = pthread_create(&thread_id, NULL, print_message, (void*) message);
   }
   
   // 创建新线程并传入参数
   if (result != 0)
   {
     printf("错误:创建新线程失败。\n"); // 如果创建新线程失败则输出错误信息
     return -1;
   }
     printf("主线程结束。\n"); // 主线程输出信息
   return 0;
}

结果:进程奔溃,黑屏。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式_笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值