代码之家  ›  专栏  ›  技术社区  ›  Kerido

多线程:如何通过一个或多个线程“锁定”对象

  •  1
  • Kerido  · 技术社区  · 14 年前

    SlowData . 这些对象的操作速度相对较慢。这就是为什么在我最初加载它们时,它们会被存根数据填充。

    数组中的每个对象加载后,我可以立即在UI中显示数组。与此并行,我在数组上启动计算。这个 SlowDataComputation 对象被指示向UI报告结果(UI反过来将可视化对特定对象的修改) 慢数据 对象)。

    下面是它的样子:

    void main()
    {
      std::vector<SlowData> aData;
      aData.reserve(1000000); // one million instances
    
      Fast_PopulateVector(aData);
    
      DataUi aUi;
    
      SlowDataComputation aCalc;
      aCalc.SetUiCallback(aUi);           // instruct the object to periodically
                                          // report computation results to the UI
    
      aCalc.Slow_ComputeInSeveralThreads(aData);
    
      aUi.VisualizeInMessageLoop(aData);  // message loop that exits upon user signal
    
      if ( aCalc.StillWorking() )
        aCalc.Stop();                     // terminate threads gradually
    
      // after VisualizeInMessageLoop returns, aData will then be destroyed
    }
    

    发射 几个 线程,每个线程将处理数组中的特定段:

    class SlowDataComputation
    {
      std::vector<SlowData> * myData;
      DataUi                * myUI;
    
    public:
      void Slow_ComputeInSeveralThreads(std::vector<SlowData> & theV)
      {
        myData = &theV;
    
        size_t aSize = myData->size();
        size_t aNumThreads = 10;
        size_t aBlockSize = aSize / aNumThreads;
    
        for (size_ti = 0; i < aNumThreads; i++)
        {
          ComputationThread aThr(myData);
          aThr.SetBoundary(i * aBlockSize, (i+1) * aBlockSize);
          aThr.SetUiCallback(myUI);
    
          aThr.Run();   // process a given segment in the array
        }
      }
    };
    

    class DataUi
    {
      std::vector<SlowData> * myData;
    
    public:
      void VisualizeInMessageLoop()
      {
        Message aMsg;
    
        while ( HasMessage(aMsg) )
          if (aMsg.Code == Message::MSG_PROGRAM_QUIT)
            SignalQuit();  // next time, HasMessage will return false
    
        // return from message loop
      }
    };
    

    问题是 慢数据 十个人中的任何一个 计算线程当前正在处理一个对象,销毁需要等待这些计算线程中的每个线程完成(要么是因为它已完成处理,要么是因为 SlowDataComputation::Stop 方法被调用?哪个同步原语最适合此任务?

    我设法用计算机解决了这个问题 计算线程。我用了关键部分。但是这个解决方案不能很好地扩展到多个计算线程。

    1 回复  |  直到 14 年前
        1
  •  1
  •   Manuel Salvadores    14 年前

    在你生命的尽头 main 功能 join 你所有的线程 pthread_join

      for(t=0; t<NUM_THREADS; t++) {
         rc = pthread_join(thread[t], &status);
         //check rc and status
      }
      //destroy shared data safely. All the threads are done.