gpt4 book ai didi

c++ - 我如何在 QNX 上强制使用特定的线程序列?

转载 作者:太空宇宙 更新时间:2023-11-04 12:00:53 26 4
gpt4 key购买 nike

我有 3 个线程:A、B 和 C,我想在 QNX 实时操作系统上用 C++ 安排序列 A、B、B、C、C、C、B、B、A。我的方法是使用信号量并保存最后执行的线程(因为 B->C 和 B->A):

#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
/*semaphores*/
sem_t sa = 1;
sem_t sb = 0;
sem_t sc = 0;

char last; //remember the last processed thread


void* threadA (void* a)
{
while(1)
{
sem_wait(&sa); //p(sa)
printf("threadA \n"); //threads function
last = 'A'; //mark A as last processed
sem_post(&sb); //v(sb)
}
}

void* threadB (void* a)
{
int c = 1;
while(1)
{
printf("threadB\n");
if (c == 2)
{
sem_wait(&sb);
c = 1;
if (last == 'A')
{
last = 'B';
sem_post(&sc);
}
if (last == 'C')
{
last = 'B';
sem_post(&sb)
}
}
c++;
}
}

void* threadC (void* a)
{
int c = 1;
while(1)
{
printf("threadC \n");
if (c == 3)
{
sem_wait(&sc);
c = 1;
last = 'C';
sem_post(&sb);
}
c++;
}
}

int main()
{
pthread_create (&threadA, NULL, threadA, NULL);
pthread_create (&threadB, NULL, threadB, NULL);
pthread_create (&threadC, NULL, threadC, NULL);
}

不幸的是,我无法测试我的代码,因为我没有安装 QNX。所以我的问题是:这会起作用吗?是否有更好的或内置的方法来做到这一点?

最佳答案

你依赖于立即开始运行的线程或类似的东西吗?肯定有更好的方法来做到这一点。

你的线程应该在做任何事情之前等待它们的信号量。

我会将调度逻辑移到一个公共(public)点(可能传入线程类型和迭代次数,然后它会发出信号)。

我会让每个 sem_post 发出一个循环迭代请求的信号。所以如果你想让 C 运行 3 次,调用 sem_post 3 次。

我不知道你在用 pthread_create 的第一个参数做什么。用线程数据覆盖函数?坏主意。

由于这是 C++,我会将线程的创建封装到一个对象中。我会在 void* arg 中传递诸如信号量之类的东西以等待。

我怀疑您要么需要更多编写多线程代码的经验,要么需要具备在实时平台上进行调试的能力,才能成功完成您的任务。

关于c++ - 我如何在 QNX 上强制使用特定的线程序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14159630/

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