繁体   English   中英

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

[英]What is a basic example of "low-level" multi-threading in C++?

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

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

“低级线程”的规范实现是pthreads 通常与 pthread 一起教授的线程问题的最基本示例是某种形式的读者和作者问题 该页面还链接到更经典的线程问题,如生产者/消费者和用餐哲学家。

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

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

“我实现了一个多线程 AI 例程,在可用 CPU 资源中为 NPC 分配决策树计算。正确锁定,尤其是在将代码与应用程序的其余部分集成时,很困难。我们还花了一些时间跟踪每个线程的资源使用情况因此,当 AI 处理威胁到主 UI 响应能力时,我们可以对其进行节流。”

(这些都是我编造的,我个人实际上并没有做过。

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

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( writer, &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;
}

我会看一下http://zthread.sourceforge.net/ ,它是 PThreads 库的优秀包装器。 这是一个非常快速和稳定的库,可以是相当低级的库。 写得很好,有据可查。

老实说,我认为你一直在做的事情和使用 pthreads 之间没有太大区别。 如果您使用线程完成了大量工作,您就会遇到锁定、同步等所有问题,并且可以很容易地直接使用 pthreads 调用。 您可能与此绝缘的稍微棘手的一件事是终止,从线程中获取退出代码等。

(当然,pthreads 并不像您所能获得的那么低;如果您使用的是 linux,请查看 clone() 以了解它在系统调用级别上的实际工作方式。但除非他们真正使用它,否则没有人真正使用它)重新实现 pthread。)

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

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

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

此外, Boost Threads是围绕 pthreads 和 Windows 线程的相当可移植的包装器......据我所知,许多游戏开发商店使用 C++ 并且喜欢一些 Boost 库。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM