八十 C语言之pthread_cond_t信号变化探究总结

1.前言
本篇目的: 理解与it用法区别
函数区别
与函数成对出现 , 如果没有给它发信号 , 它死等 , 等到天荒地老…
it
自己设置超时时间,一旦超过设定时间,自动执行it函数后边的代码 。如果在it 设置超时时间之前给它发信号 , 它会收到信号 , 提前结束等待 。
一次只能唤醒一个等待中的线程
st
可以唤醒全部等待中的线程
Linux中用于互斥锁的结构体类型 。互斥锁用于保护临界区 , 确保同时只有一个线程可以访问共享资源 。

八十  C语言之pthread_cond_t信号变化探究总结

文章插图
在Linux中 , 是用于线程间同步的条件变量 。条件变量用于在线程之间传递信号 , 帮助线程进行等待和唤醒操作 。条件变量通常与互斥锁()一起使用 。当某个线程需要等待某个条件满足时 , 它会调用函数将自己阻塞 , 并释放占有的互斥锁 。当另一个线程满足了条件并调用了或st函数发送信号时 , 等待的线程会被唤醒并重新获取互斥锁 , 从而继续执行 。
2.代码示例 v1.0 和用法
#include #include #include #include using namespace std;pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;pthread_cond_t cond = PTHREAD_COND_INITIALIZER;int main() {std::thread thread = std::thread([&]() {cout << "线程等待信号到来..." << endl;pthread_mutex_lock(&mutex);//1.如果不调用pthread_cond_signal(&cond)函数发信号,永远死等.pthread_cond_wait(&cond, &mutex);cout << "Thread timed wait for 10s." << endl;pthread_mutex_unlock(&mutex);});//1.给pthread_cond_wait和pthread_cond_timedwait发信号(它俩是成对出现的),使其后边的代码可以执行.sleep(1);pthread_cond_signal(&cond);//仅可以唤醒一个线程sleep(2);printf("%s() [%d], cond.__data = http://www.kingceram.com/post/%d/n",__FUNCTION__,__LINE__,*((int*)(&(cond.__data))));thread.join();return 0;}
v2.0 和it用法
#include #include #include #include #include using namespace std;pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;pthread_cond_t cond = PTHREAD_COND_INITIALIZER;int main() {//1.给pthread_cond_wait和pthread_cond_timedwait发信号(它俩是成对出现的),使其后边的代码可以执行.std::thread thread = std::thread([&]() {cout << "线程等待信号到来..." << endl;struct timeval now;struct timespec outtime;gettimeofday(&now, NULL);outtime.tv_sec = now.tv_sec + 10;//如果没有等到信号,则超过10s后自动处理.outtime.tv_nsec = now.tv_usec * 1000;pthread_mutex_lock(&mutex);printf("%s() [%d], cond.__data = http://www.kingceram.com/post/%d/n",__FUNCTION__,__LINE__,*((int*)(&(cond.__data))));//2.可以设置超时时间,一旦超过设定时间,自动执行pthread_cond_timedwait函数后边的代码,它不受pthread_cond_signal的影响.pthread_cond_timedwait(&cond, &mutex, &outtime);printf("%s() [%d], cond.__data = http://www.kingceram.com/post/%d/n",__FUNCTION__,__LINE__,*((int*)(&(cond.__data))));cout << "Thread timed wait for 10s." << endl;pthread_mutex_unlock(&mutex);});sleep(1);pthread_cond_signal(&cond);//仅可以唤醒一个线程sleep(2);thread.join();return 0;}
v3.0 st和用法
#include #include #include #include using namespace std;pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;pthread_cond_t cond = PTHREAD_COND_INITIALIZER;int main() {std::thread thread = std::thread([&]() {cout << "线程等待信号到来..." << endl;pthread_mutex_lock(&mutex);//1.如果不调用pthread_cond_signal(&cond)函数发信号,永远死等.pthread_cond_wait(&cond, &mutex);cout << "Thread timed wait for 10s."