0
gcc 4.7.2
c89

你好,

我正在尝试停止在工作线程中运行的事件循环。

我用另一个函数的结构中的条件来控制 while 循环。但是,该值似乎没有改变。它不会进入 switch 语句条件 IMP_STATE_STOPPED 因此不能将条件设置为 false 以停止 do..while 循环。

imp 结构是这样的:

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