0

私はC++でスレッドベースのアプリケーションを書いています。以下は、スレッド数をチェックする方法を示すサンプルコードです。どの時点でも、アプリケーションから生成されるワーカースレッドが20個しかないことを確認する必要があります。

#include<stdio.h>
using namespace std;
class ThreadWorkerClass
{
  private:
    static int threadCount;
  public:
    void ThreadWorkerClass()
    {
      threadCount ++;
    }
    static int getThreadCount()
    {
      return threadCount;
    }
    void run()
    {
      /* The worker thread execution
       * logic is to be written here */
      //Reduce count by 1 as worker thread would finish here
      threadCount --;
    }
}

int main()
{
  while(1)
  {
    ThreadWorkerClass twObj;
    //Use Boost to start Worker Thread
    //Assume max 20 worker threads need to be spawned
    if(ThreadWorkerClass::getThreadCount() <= 20) 
      boost::thread *wrkrThread = new boost::thread(
        &ThreadWorkerClass::run,&twObj);
    else
      break;
  }
  //Wait for the threads to join
  //Something like (*wrkrThread).join();
  return 0;
}

この設計では、変数をロックする必要がありますthreadCountか?このコードをマルチプロセッサ環境で実行するとします。

4

1 に答える 1

3

デザインは十分ではありません。問題は、コンストラクターを公開したことです。そのため、好むと好まざるとにかかわらず、ユーザーはオブジェクトのインスタンスを必要な数だけ作成できます。ある種のスレッドプーリングを行う必要があります。つまり、プールのセットを維持するクラスがあり、利用可能な場合はスレッドを提供します。何かのようなもの

class MyThreadClass {
   public:
      release(){
        //the method obtaining that thread is reponsible for returning it
      }
};

class ThreadPool {
  //create 20 instances of your Threadclass
  public:
  //This is a blocking function
  MyThreadClass getInstance() {
     //if a thread from the pool is free give it, else wait
  }
};

したがって、すべてがプーリングクラスによって内部的に維持されます。そのクラスを他の人に制御させないでください。hasFreeThreads()、numFreeThreads()などのクエリ関数をプーリングクラスに追加することもできます。

スマートポインタを提供することでこのデザインを強化することもできるので、スレッドをまだ所有している人の数を追跡できます。プロセスがクラッシュし、トレッドが戻らないため、スレッドを解放する責任を負う人々を危険にさらすことがあります。これには多くの解決策があります。最も簡単な方法は、スレッドがなくなったときに各スレッドの時計を維持することです。強制的に取り戻されます。

于 2012-09-05T13:22:18.667 に答える