0
gcc 4.7.2
c89

こんにちは、

ワーカー スレッド内で実行されているイベント ループを停止しようとしています。

別の関数からの構造体の条件で while ループを制御します。ただし、値は変わらないようです。switch ステートメントの条件 IMP_STATE_STOPPED に入らないため、条件を false に設定して do..while ループを停止することはできません。

インプ構造は次のようなものです。

enum states_e {IMP_STATE_STARTED, IMP_STATE_STOPPED};
struct imp_t {
    states_e state;
};

is_loopingこれは私が持っているものです - 重要なスニペットのみ: イベント ループを持つワーカー スレッド関数は、false に変更されるまで回転します。

static void* g_imp_evt_loop(apr_thread_t *thd, void *data)
{
    imp_t *imp = NULL;
    volatile apr_status_t is_looping = TRUE;

    imp = (imp_t*)data;
    if(!imp) {
        return NULL;
    }

    printf("[ %p ]", imp);

#define SR_TIMEOUT 500

    do {
        if(waitevt(SR_TIMEOUT) >= 0) {
            switch(imp->state) {
            case IMP_STATE_STARTED:
            {
                /* do some work */
            }
            break;

            case IMP_STATE_STOPPED:
                is_looping = FALSE;
                break;
            }

            apr_sleep(250000);
        }
    } while(is_looping);

    return NULL;
}

これは、別の関数から呼び出されるワーカー スレッドを開始するスニペットです。

void start_working(imp_t *imp)
{
    printf("[ %p ]\n", imp);

    if(apr_thread_pool_schedule(imp->module->thd_pool,
                                g_imp_evt_loop,
                                (void*)imp,
                                0, /* Start now */
                                NULL) != APR_SUCCESS) {
        return FALSE;
    }
}

そして、停止関数で、imp 構造体の条件を に設定しましたIMP_STATE_STOPPED

void stop_working(imp_t *imp)
{
    printf("[ %p ]\n", imp);
    imp->state = IMP_STATE_STOPPED;
}

データが変更できないワーカー スレッド関数に対してローカルである可能性はありますか?

各関数のアドレスを出力しましたが、imp ie のすべてのアドレスは同じです。0x923b710

ご提案いただきありがとうございます。

4

0 に答える 0