- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我对要在 QNX 上运行的这段代码有疑问:
class ConcreteThread : public Thread
{
public:
ConcreteThread(int test)
{
testNumber = test;
}
void *start_routine()
{
for(int i = 0; i < 10; i++)
{
sleep(1);
cout << testNumber << endl;
}
}
private:
int testNumber;
};
class Thread
{
public:
Thread(){};
int Create()
{
pthread_t m_id;
return pthread_create(&m_id, NULL, &(this->start_routine_trampoline), this);
}
protected:
virtual void *start_routine() = 0;
private:
static void *start_routine_trampoline(void *p)
{
Thread *pThis = (Thread *)p;
return pThis->start_routine();
}
};
现在,当我在 *start_routine 中不休眠地运行这段代码时,它将简单地打印 10 次该数字,然后继续执行下一行代码(顺序而不是并行)。但是,当我像在代码中那样使用 sleep 时,它根本不打印任何数字,只是继续执行下一行代码。为什么 sleep 不起作用?我怎样才能使这样的线程起作用,而不是按顺序运行?
最佳答案
注意 1:如果您只有 1 个处理器,那么无论您创建多少线程,代码都只能按顺序执行。在为下一个线程换出之前,每个线程都会获得一段处理器时间。
注意 2:如果主线程退出,pthreads 将在它们有机会执行之前杀死所有子线程。
现在回答你的问题:
没有 sleep 。线程一旦启动,在指定的单个切片中就有足够的时间完整地执行循环 10 次。
随着 sleep :您的工作线程将 sleep 一整秒。所以你的主线程有时间做很多工作。如果此时主线程退出,worker将被杀死。
我将进行以下更改:
// Remove the Create() method
// Put thread creation in the constructor.
// Make the thread variable part of the object
pthread_t m_id;
Thread()
{
if (pthread_create(&m_id, NULL, &(this->start_routine_trampoline), this) != 0)
{
throw std::runtime_error("Thread was not created");
}
}
// Make sure the destructor waits for the thread to exit.
~Thread()
{
pthread_join(m_id);
}
如果您去看看 boost threading 库。你会发现像这样的小错误都已经被解决了;从而使线程更易于使用。
另请注意。使用静态可能有效,但它是不可移植的。这是因为 pthread 是一个 C 库,因此需要一个带有 C ABI 的函数指针。您在这里的平台很幸运。您需要将其定义为函数并使用 extern "C"声明 ABI
// This needs to be a standard function with C Interface.
extern "C" void *start_routine_trampoline(void *p)
{
}
关于c++ - QNX C++线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/433220/
我正在QNX操作系统中运行某些守护程序用户进程以及某些Xlet GUI应用程序。我使用TeraTerm连接到QNX控制台。我需要获取正在运行的用户应用程序/进程的列表才能查看哪些用户应用程序已在运行在
我需要测试以下情况:在 QNX 系统上运行的 C 程序可以打开文件但无法读取它。我的任务是确保在这种情况下程序提供正确的错误消息。操作文件权限不起作用。 有人知道如何模拟这种情况吗?预先非常感谢您 最
我正在使用 QNX neutrino 实时操作系统,我是 QNX 的新手。我已经设置了我的第一个项目,在两个线程之间使用了一些 IPC 消息传递。 我想要做的是将一个线程作为麦克风“驱动程序”,对来自
我的多线程应用程序随机崩溃并且没有生成核心转储,这让我的分析变得非常非常困难。我将 ulimit 设置为 unlimited 并且正在运行 dumper。我看到崩溃时生成了一个信号 11,理想情况下它
我正在尝试在 QNX 上编译一个使用 libxml 的项目。我已在系统上安装了 libxml,并打开了对 xmlschema 的支持。但我仍然收到以下错误消息“xmlSchemaParserCtxtP
是否有一个标志传递给链接器,它将不在library.a 输出中包含每个文件的时间戳? 我们正在使用 qcc -A 参数创建一个库,当它执行此操作时,它会将所有已编译的文件正确地收集到库中,但它总是会添
我有 3 个线程:A、B 和 C,我想在 QNX 实时操作系统上用 C++ 安排序列 A、B、B、C、C、C、B、B、A。我的方法是使用信号量并保存最后执行的线程(因为 B->C 和 B->A): #
在 Linux 中,如果我们查看/proc/self/maps: 00400000-004ef000 r-xp 00000000 08:01 12845058
我编写了一个在 Linux 下编译和运行的程序。它工作正常。然后我被迫将它移植到 QNX。 我做了,当我试图在那里编译它时(qnx with momentics)我得到了一个神秘的错误: timer_
我想在互联网上寻找有关如何为 QNX 开发良好的 UI 应用程序的正确文章。我能够找到类似的东西 - 我们可以使用 jamaicaVM 将我们在 java 上开发的代码移植到 c 。 以下是我的问题:
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
即感兴趣的分区已经挂载为只读。需要将分区挂载为启用 rw 的分区,以便单独执行特定行的脚本。之后,分区应该进入其之前的只读状态。 最佳答案 问题是针对 QNX 操作系统的。并且可以使用以下命令将分区重
我对要在 QNX 上运行的这段代码有疑问: class ConcreteThread : public Thread { public: ConcreteThread(int test)
我在机器上安装了 QNX。问题是,嵌入式系统还必须能够访问硬件、端口管理等。这在 QNX 中是如何实现的?往什么方向学习?到目前为止,我发现这是文件、目录、用户、组等的组织,或者我不明白系统的运行原理
我试图通过/proc/{pid}/as 为 qnx 6.6 创建我自己的进程管理器。 但我只需要更改一个操作 (io_open),所有其他操作应该继续使用旧文件 (/proc/{pid}/as)。 我
我要重新提出一个属于https://stackoverflow.com/questions/12418452/source-files-in-project-subfolder-not-compile
我一直在阅读有关 Apache Nifi 的可能性的信息。在这篇文章中http://www.zdnet.com/article/hortonworks-cto-on-apache-nifi-what-
我正在尝试为两个显示器创建 Qt 应用程序渲染。 QNX 已经配置,用于 2 个显示器。我们创建了两个窗口,但我们如何告诉 Qt 将窗口渲染到第二个显示器? 这是我的代码片段 QGuiApplicat
如果有人知道如何在 QNX 中重置进程 ID,请告诉我。我正在网上搜索,但似乎什么也没找到。我实际上需要编写一个脚本来执行以下操作: 查找当前进程 ID 如果 PID 大于某个特定值,则重置 PID
让我们在 Eclipse 中举一个例子:我有两个不同的源文件用于一个具有主要功能的 Startup,但是根据我使用的构建配置,使用其中一个,或者另一个。 我这样做是通过在一个构建配置中使用“-d”选项
我是一名优秀的程序员,十分优秀!