簡體   English   中英

pthreads:觸發其他線程的線程

[英]pthreads: a thread that triggers other threads

您好,我是多線程編程的新手。 我正在嘗試創建一個創建線程THREAD1的代碼,該線程完成某些操作后會觸發另外兩個線程,例如THREAD2和THREAD3,然后退出。

我寫了兩個可能的解決方案。

1)使用條件變量(不起作用:在某些情況下會出現死鎖):

pthread_mutex_t ready_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t  ready_cond  = PTHREAD_COND_INITIALIZER;
bool ready = false;

void* trigger(void*);
void* func1(void*);
void* func2(void*);

int main()
{
    pthread_t thread1;
    pthread_t thread2;
    pthread_t thread3;  
    pthread_create(&thread1, 0, &trigger, 0);
    pthread_create(&thread2, 0, &func1, 0);
    pthread_create(&thread3, 0, &func2, 0);
    pthread_join(thread1, 0);
    pthread_join(thread2, 0);
    pthread_join(thread3, 0);
}

void *trigger(void*)
{
    pthread_mutex_lock(&ready_mutex);
    ready = true;
    pthread_cond_broadcast(&ready_cond);
    pthread_mutex_unlock(&ready_mutex);
    return 0;
}

void *func1(void*)
{
    while (!ready) // Needed to avoid spuriuos wake-up
    {
        pthread_mutex_lock(&ready_mutex);
        pthread_cond_wait(&ready_cond, &ready_mutex);
        pthread_mutex_unlock(&ready_mutex);
    }
    std::cout << "In 'func1'>> Do something" << std::endl;
    return 0;
}

void *func2(void*)
{
    while (!ready) // Needed to avoid spuriuos wake-up
    {
        pthread_mutex_lock(&ready_mutex);
        pthread_cond_wait(&ready_cond, &ready_mutex);
        pthread_mutex_unlock(&ready_mutex);
    }
    std::cout << "In 'func2'>> Do something" << std::endl;
    return 0;
}

2)THREAD1直接創建其他兩個線程。

pthread_mutex_t ready_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t  ready_cond  = PTHREAD_COND_INITIALIZER;

pthread_t thread1;
pthread_t thread2;
pthread_t thread3;

void* trigger(void*);
void* func1(void*);
void* func2(void*);

int main()
{
    pthread_create(&thread1, 0, &trigger, 0);

    pthread_join(thread1, 0);
    pthread_join(thread2, 0);
    pthread_join(thread3, 0);
}

void *trigger(void*)
{
    std::cout << "In 'trigger'>> Do something" << std::endl;

    pthread_create(&thread2, 0, &func1, 0);
    pthread_create(&thread3, 0, &func2, 0);

    return 0;
}

void *func1(void*)
{
    std::cout << "In 'func1'>> Do something" << std::endl;

    return 0;
}

void *func2(void*)
{
    std::cout << "In 'func2'>> Do something" << std::endl;

    return 0;
}

我想知道你的意見。 非常感謝你

使用條件變量(不起作用:在某些情況下會出現死鎖):

檢查共享變量ready的狀態時,代碼不會鎖定互斥體。 當它鎖定的互斥ready可能到那個時候已經隨之改變,這就是為什么你看到死鎖。

使用條件變量等待狀態更改的正確版本是(省略錯誤檢查):

pthread_mutex_lock(&ready_mutex);
while(!ready) // Needed to avoid spuriuos wake-up
    pthread_cond_wait(&ready_cond, &ready_mutex);
// ready == true here
pthread_mutex_unlock(&ready_mutex);

以上假設僅當保持相同的互斥鎖時, ready才會更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM