QNX c线程问题
作者:互联网
我有一个关于此代码的问题,我想在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次,然后继续下一行代码(顺序而不是并行).但是,当我在代码中使用睡眠时,它根本不打印任何数字,只是继续下一行代码.为什么不睡觉工作,我怎样才能创建这样的线程,而不是运行顺序?
解决方法:
注1:如果您只有1个处理器,则无论您创建多少个线程,代码都只能按顺序执行.每个线程在换出下一个线程之前都会获得一段处理器时间.
注意2:如果主线程退出pthreads将在它们有机会执行之前终止所有子线程.
现在回答你的问题:
没有睡觉.线程一旦启动就有足够的时间在单个切片中给出完全执行循环10次.
随着睡眠:你的工作线程将睡一整秒.所以你的主线程有时间做很多工作.如果主线程在此时退出,则工作人员将被杀死.
我会做出以下更改:
// 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);
}
如果你去看看增强线程库.你会发现像这样的所有小错误已经得到了照顾;从而使线程更易于使用.
另请注意.使用静态可能有效,但它不可移植.这是因为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,multithreading,qnx 来源: https://codeday.me/bug/20190730/1585318.html