具有互斥和semapohres的多线程程序

时间:2015-12-11 09:02:33

标签: c windows multithreading mutex semaphore

使用多线程计算有3个系列 要访问系列,您需要等待信号量,然后您需要知道您是构建器线程还是清理线程。
当我有多个线程时,一切都很好,所有这些线程都有什么要做,并且没有“浮动”线程无法访问信号量或互斥量。
如果我确实有太多的线程并且没有做什么,那么程序会被卡住,除非在WaitSemRes / WaitMutexRes之后我杀了那个线程但是我不想这样做,因为我失去了很多计算时间。 我只是希望他们一直等到他们有事可做 我错过了什么吗?

/* Thread is trying to enter specific series, if couldnt - try the next one*/

WaitSemRes = WaitForSingleObject(main_series[series_idx].semaphore, 0L);
    if (WaitSemRes == WAIT_OBJECT_0) {

        /* Check if i'm the cleaning thread */
        if (main_series[series_idx].ready_to_clean) {

            /* Catching series mutex to clean it alone */
            WaitMutexRes = WaitForSingleObject(main_series[series_idx].mutex, INFINITE);
            if (WaitMutexRes == WAIT_OBJECT_0) 
                // do something //
            }
            else {
                ExitThread(0);
            }

             // do stuff
    else {
        ExitThread(0);
    }

1 个答案:

答案 0 :(得分:0)

您可以使用关闭事件来表示在没有更多工作要做的情况下线程,这样他们可以无限期地等待。它可以使用CreateEvent创建,然后您需要做的就是让您的工作线程等待它。完成所有工作后,您可以使用SetEvent几乎同时退出所有线程,然后等待包含所有螺纹手柄的HANDLE阵列

有关如何等待多个对象的详细信息,请参阅WaitForMultipleObjects Example

工作线程

int thread_function(...) {
[...]
    while(WaitForSingleObject(thread_shutdown_event, 0) != WAIT_OBJECT_0) {
        // Keep trying to process data until the event is signalized
    }
    // Exit thread
    return 0;
}

游泳池处理功能

void end_thread_pool(...) {
    HANDLE wait_result;

    if(thread_shutdown_event == NULL)
        return;
    // Activate shutdown event
    SetEvent(thread_shutdown_event);
    // Wait upon thread handle list until all threads can return safely
    wait_result = (HANDLE)WaitForMultipleObjects(...);
    if(wait_result != WAIT_OBJECT_0) {
        // Failed to wait
    }
    CloseHandle(thread_shutdown_event);
[...]
    return;
}


void init_thread_pool(...) {
[...]
    thread_shutdown_event = CreateEvent(NULL, // Default security attributes
                                        TRUE, // Manual reset?
                                        FALSE,// Starting value
                                        TEXT("Thread Shutdown event"));// Event name
    if(thread_shutdown_event == NULL) {
        // Failed to create event
        return;
    }
    // Initiates threads and also puts their HANDLEs in a array
    // that is going to be used in end_thread_pool to wait
    // See 'WaitForMultipleObjects Example'
    thread_create(thread_function, number_of_threads);
[...]
    return;
}
相关问题