gpt4 book ai didi

c++ - QNX C++线程问题

转载 作者:太空狗 更新时间:2023-10-29 20:19:32 26 4
gpt4 key购买 nike

我对要在 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/

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