In my demo, I create 3 threads, the first and the second thread are wait for the global pthread_cond with different pthread_mutex, the last thread will call pthread_cond_broadcast.
pthread_mutex_t g_mutex1 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t g_mutex2 = PTHREAD_MUTEX_INITIALIZER;
auto tStart = std::chrono::steady_clock::now();
void* ThreadTaskOne(void* arg)
{
pthread_mutex_lock(&g_mutex1);
pthread_cond_wait(&g_cond, &g_mutex1);
auto tEnd = std::chrono::steady_clock::now();
auto diff = std::chrono::duration<double>(tEnd - tStart);
printf("task 1 pthread_cond_wait end time %f\n", diff.count());
sleep(1);
pthread_mutex_unlock(&g_mutex1);
tEnd = std::chrono::steady_clock::now();
diff = std::chrono::duration<double>(tEnd - tStart);
printf("task 1 pthread_cond_broadcast end time %f\n", diff.count());
return nullptr;
}
void* ThreadTaskTwo(void* arg)
{
pthread_mutex_lock(&g_mutex2);
pthread_cond_wait(&g_cond, &g_mutex2);
auto tEnd = std::chrono::steady_clock::now();
auto diff = std::chrono::duration<double>(tEnd - tStart);
printf("task 2 pthread_cond_wait end time %f\n", diff.count());
sleep(1);
pthread_mutex_unlock(&g_mutex2);
tEnd = std::chrono::steady_clock::now();
diff = std::chrono::duration<double>(tEnd - tStart);
printf("task 2 pthread_cond_broadcast end time %f\n", diff.count());
return nullptr;
}
void* BroadcastNotifyMutex(void* arg)
{
tStart = std::chrono::steady_clock::now();
pthread_cond_broadcast(&g_cond);
auto tEnd = std::chrono::steady_clock::now();
auto diff = std::chrono::duration<double>(tEnd - tStart);
printf("task 3 pthread_cond_broadcast end time %lf\n", diff.count());
return nullptr;
}
int main()
{
pthread_t threadOne, threadTwo, threadThree;
pthread_create(&threadOne, nullptr, ThreadTaskOne, nullptr);
pthread_create(&threadTwo, nullptr, ThreadTaskTwo, nullptr);
sleep(3);
pthread_create(&threadThree, nullptr, BroadcastNotifyMutex, nullptr);
pthread_join(threadOne, nullptr);
pthread_join(threadTwo, nullptr);
pthread_join(threadThree, nullptr);
return 0;
}