C ++中“低级”多线程的基本示例是什么?

时间:2008-10-13 15:24:48

标签: c++ multithreading

我是一个有点几年的新手开发者。最近我在一家游戏公司采访时被问到“你做过多线程了吗?”我告诉他们有一个带有几个Threads的C#应用​​程序......然后我在Sql中说了一些关于事务和锁定等的内容。面试官礼貌地告诉我,这太高级了,他们正在寻找有经验的人在C ++中进行多线程。

那么C ++中“低级”多线程的基本示例是什么?

8 个答案:

答案 0 :(得分:12)

“低级线程”的规范实现是pthreads。通常与pthreads一起教授的线程问题的最基本示例是某种形式的readers and writers problem。该页面还涉及更多传统的线程问题,如生产者/消费者和餐饮哲学家。

答案 1 :(得分:3)

这是一个使用pthreads的快速示例,基于我们的一些测试代码。它产生两个线程,并等待它们完成。

int main( void )
{
  pthread_t reader, writer;
  void *arg;

  // [... initialisation ...]

  // Spawn threads
  if( pthread_create( &reader, NULL, reader_func, arg ) ||
      pthread_create( &writer, NULL, writer_func, arg ) )
    {
      perror( "pthread_create" );
      return EX_OSERR;
    }

  // Wait while threads run
  pthread_join( reader, &arg );
  pthread_join( reader, &arg );

  return EX_OK;
}

void *reader_func( void *arg )
{
  // [... do some stuff ...]
  return NULL;
}

void *writer_func( void *arg )
{
  // [... do some different stuff ...]
  return NULL;
}

答案 2 :(得分:3)

他可能指的是你对C#的使用,而不是你的线程体验。

答案 3 :(得分:3)

如果它是游戏公司,那么他们可能想要这样的答案:

“我实现了一个多线程AI例程,在可用的CPU资源中为NPC分配了决策树计算。正确的锁定,特别是在将代码与应用程序的其余部分集成时,很难。我们还花了一些时间跟踪每个线程资源使用,因此当它可能会干扰主UI响应时,我们可以减少AI处理。“

(我做了所有这些,我个人实际上没有做过任何一件事。 grin

答案 4 :(得分:2)

我看一下http://zthread.sourceforge.net/,它是围绕PThreads库的一个很好的包装器。它是一个非常快速和稳定的,可以是相当低级的库。 写得很好并且记录在案。

答案 5 :(得分:2)

说实话,我认为你一直在做什么和使用pthreads之间有什么区别。如果您已经完成了大量的线程工作,那么您将遇到锁定,同步等所有问题,并且可以直接轻松地使用pthreads调用。你可能已经被隔离的一件有点棘手的事情就是终止,从线程中获取退出代码等。

(当然,pthreads并不像你能得到的那么低;如果你在linux上,请查看clone()以了解它在系统调用级别上是如何工作的。但是没有人真正使用它除非他们正在实施pthreads。)

答案 6 :(得分:1)

好吧,如果你真的想把这个想法带到“最大”,你愿意用线程弄脏你的手。我建议尝试实现用户空间线程库。

查看uconext.h及其各种过程(setcontext,swapcontext和makecontext),并尝试用它们编写一个简单的协作线程库。实现锁,条件变量线程创建/销毁和协作产生。它不会特别花哨(即没有实际的并行性(因为你需要将其挖掘到克隆系统调用或内核中)但如果你能做到这一点,没有人能说你没有低水平的经验。

只是为了了解项目的规模。我在大约500行c ++中编写了这样一个简单的线程库,考虑到其中至少20%是注释,断言语句和日志记录用于调试目的。

答案 7 :(得分:1)

同样Boost Threads是pthreads和Windows线程的相当可移植的包装器......从我听到的许多游戏开发商店使用C ++和一些Boost库。