gpt4 book ai didi

linux - 从 bash 和 linux 调度创建实时 linux 线程

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:08:14 26 4
gpt4 key购买 nike

我是 Linux 内核开发的新手。我正在尝试学习线程创建和同步。我的最终目标是创建两个线程,这两个线程使用由信号量保护的共享资源。

代码是

#include<stdio.h>
#include<string.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>
#include<semaphore.h>

sem_t sema_obj;

pthread_t tid[2];

int shared_val = 0;

void* doSomeThing(void *arg)
{
unsigned long i = 0;
pthread_t id = pthread_self();

for(i=0;i<5;i++){
printf("\n going to wait %x\n",(unsigned int)id);
sem_wait(&sema_obj);
shared_val++;
sleep(1);
printf("\n %d The value of shared_val is %d in thread %x \n",(int)i, shared_val, (unsigned int)id);
sem_post(&sema_obj);
printf("\n gave up sem %x\n",(unsigned int)id);
}

for(i=0; i<(0xFFFFFFFF);i++);

return NULL;
}

int main(void)
{
int i = 0;
int err;
sem_init(&sema_obj, 0, 1);
while(i < 2)
{
pthread_attr_t attr;
struct sched_param param;

pthread_attr_init(&attr);
pthread_attr_setschedpolicy(&attr, SCHED_FIFO);
param.sched_priority = 50;
pthread_attr_setschedparam(&attr, &param);
//sched_setscheduler(current, SCHED_FIFO, &param);
err = pthread_create(&(tid[i]), &attr, &doSomeThing, NULL);
//err = pthread_create(&(tid[i]), NULL, &doSomeThing, NULL);
if (err != 0)
printf("\ncan't create thread :[%s]", strerror(err));
else
printf("\n Thread created successfully 0x%X \n",(unsigned int)tid[i]);

i++;
}
enter code here
sleep(60);
return 0;
}

我正在编译它

gcc -o threads_op -pthread -lrt threads.c

运行代码后,我看到:

 Thread created successfully 0xB75CBB40 

going to wait b75cbb40

Thread created successfully 0xB6DCAB40

going to wait b6dcab40

0 The value of shared_val is 1 in thread b75cbb40

gave up sem b75cbb40

going to wait b75cbb40

1 The value of shared_val is 2 in thread b75cbb40

gave up sem b75cbb40

going to wait b75cbb40

2 The value of shared_val is 3 in thread b75cbb40

gave up sem b75cbb40

going to wait b75cbb40

3 The value of shared_val is 4 in thread b75cbb40

gave up sem b75cbb40

going to wait b75cbb40

4 The value of shared_val is 5 in thread b75cbb40

gave up sem b75cbb40

0 The value of shared_val is 6 in thread b6dcab40

gave up sem b6dcab40

going to wait b6dcab40

1 The value of shared_val is 7 in thread b6dcab40

gave up sem b6dcab40

going to wait b6dcab40

2 The value of shared_val is 8 in thread b6dcab40

gave up sem b6dcab40

going to wait b6dcab40

3 The value of shared_val is 9 in thread b6dcab40

gave up sem b6dcab40

going to wait b6dcab40

4 The value of shared_val is 10 in thread b6dcab40

gave up sem b6dcab40

对于这个进程,RTPRIO 是'-',S 1000 4551 4338 - 00:00:00 threads_op

有以下问题,

1) 为什么线程不是实时的并采用我设置的优先级?

2) 为什么信号量没有被两个线程交替锁定并更新共享变量?这两个线程具有相同的优先级。

如果您知道一步一步的动手教程来理解 linux 内核主题,请分享。

最佳答案

一些事情。

首先,我不想对事情吹毛求疵,但你不是在做 linux kernel 开发。您正在编写一个在 Linux 上运行的多线程应用程序。因此,linux-kernel 标签是不合适的。内核开发是关于编写内置于内核中的代码,例如调度程序、设备驱动程序、文件系统驱动程序等。

您在临界区有一个 sleep (例如在sem_waitsem_post 之间)。您正在经历“线程饥饿”。在这里查看我的答案:Thread Synchronization C++

由于您使用的是 pthreads,因此使用 pthread_mutex_lock/pthread_mutex_unlock 可能会更好。

您还使用了 printf。它们会扰乱时序,即使是调试。

您正在尝试执行 SCHED_FIFO 但未检查返回码。只有 root 可以设置一些 RT 调度程序和/或更高 [er] 优先级。同样,对于调度优先级。

哇! SCHED_FIFO 的优先级为 50?如果你真的得到它,任何高于 11 的东西都会以比某些内部内核线程更高的优先级安排你。您可能会牢牢锁定系统。 [*]

在您所处的阶段,在您“全力以赴”[使用 RT 调度程序等] 之前,以标准优先级使用普通调度程序。您会惊讶于它的性能。在启动电压之前先调试您的线程同步代码/逻辑。

实际上,对于确定性和低延迟的流畅、高度响应的 RT 应用程序,我认为您需要更多地规划如何同步、线程之间的队列、类型锁定(例如 RCU、trylocks、锁定尝试超时等)您需要多少个线程?每个人会做什么?每个都有伪代码吗?什么类型的线程环境(例如消费者/生产者、主/从/ worker )。您的线程会进行“工作窃取”吗?等等,等等,你会使用 IPC 消息传递、共享内存吗?多少数据?线程间数据的带宽是多少?

[*] 我之所以知道这一点,是因为我是一个实时系统的开发人员,该系统具有 50 个线程、8 个内核,并且与多个设备驱动程序和 FPGA 以及大量 DMA 不断交互[如此之多,我们有用 PCIe 总线分析仪对其进行测量,以确保总线具有足够的带宽]。它现在是一种运输产品。

关于linux - 从 bash 和 linux 调度创建实时 linux 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33728259/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com