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
ご提案いただきありがとうございます。