1

Boost :: functionは、あるfunction1を別のfunction1に割り当てようとすると、10回に1回例外をスローします。

Taskはのtypedefですboost::function1<void, void*>

具体的なコードは次のとおりです。

    // the Task object sent in as Task task
    void Sleeper(void* arg)
    {
        int32_t sleepTime = *(int32_t*)arg;

        SleepCurrentThread((int32_t)sleepTime);
    }

    struct ThreadInfo
    {
        ThreadInfo() : mState(DETACHED), mTask(NULL), mArg(NULL)
        { }

        ThreadState mState;
        Task mTask;
        void* mArg;
    };

    Thread::Thread(Task task, void* arg, IMemoryAllocator& allocator, ILogManager& logger) : mAllocator(allocator), mLogger(logger)
    {
        mThreadInfo = (ThreadInfo*) mAllocator.Allocate(sizeof(ThreadInfo));  // simnple heap allocation

        mThreadInfo->mArg = arg;
        mThreadInfo->mState = Thread::RUNNING;
        mThreadInfo->mTask = task;     //<--------- throws... sometimes


        mHandle = _CreateThread(&Run, (void*)mThreadInfo);
        if (!mHandle)
            Detach();


    }

具体的には、ブーストfunction_template.hppで、このコードの代入演算子に追跡し、最終的に次のようにスローします。

// Assignment from another BOOST_FUNCTION_FUNCTION
    BOOST_FUNCTION_FUNCTION& operator=(const BOOST_FUNCTION_FUNCTION& f)
    {
      if (&f == this)
        return *this;

      this->clear();
      BOOST_TRY {
        this->assign_to_own(f);        // <--- throws, and then line below re-throws
      } BOOST_CATCH (...) {
        vtable = 0;
        BOOST_RETHROW;
      }
      BOOST_CATCH_END
      return *this;
    }

どうしてこれなの?私のコードに間違っていることを簡単に見つけることができますか?他に必要なものはありますか?

ありがとう

編集:boost :: threadsを使用するように求められることはわかっていますが、win32 / pthreadの周りに独自のラッパーを試しています(楽しみのために)

4

1 に答える 1

5

あなたstructには重要なコンストラクターがありますが、それを呼び出していません。Taskメンバーは初期化されません。初期化するには、オブジェクト全体を で割り当てるか、newplacement new を使用して次のように初期化します。

    void *mem = mAllocator.Allocate(sizeof(ThreadInfo));  // simnple heap allocation
    mThreadInfo = new(mem) ThreadInfo; // placement new

    mThreadInfo->mArg = arg;
    mThreadInfo->mState = Thread::RUNNING;
    mThreadInfo->mTask = task;

Placement new は、既に割り当てられている生の (初期化されていない) メモリにオブジェクトを構築します。

于 2012-08-31T20:18:01.190 に答える