打破在另一个线程中运行的do..while事件循环

时间:2013-02-21 09:06:18

标签: c multithreading

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的所有adddress都相同,即0x923b710

非常感谢任何建议,

0 个答案:

没有答案