【问题标题】:What is a basic example of "low-level" multi-threading in C++?C ++中“低级”多线程的基本示例是什么?
【发布时间】:2010-09-16 21:55:21
【问题描述】:

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

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

【问题讨论】:

  • c#?你不妨告诉他你更喜欢 Java ;)

标签: c++ multithreading


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      (这些都是我编的,我个人并没有真正做过。咧嘴一笑

      【讨论】:

        【解决方案4】:

        这是一个使用 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;
        }
        

        【讨论】:

        • 我知道这已经很古老了,但您可能想修正连接中的那个错字。
        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            【解决方案7】:

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

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

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

            【讨论】:

              【解决方案8】:

              此外,Boost Threads 是 pthread 和 Windows 线程的相当便携的包装器……据我所知,许多游戏开发商店都使用 C++ 和一些 Boost 库。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-01-19
                • 2016-02-29
                • 2019-11-19
                • 2019-04-27
                • 1970-01-01
                相关资源
                最近更新 更多