【linux笔记1.2】在多线程开发中尽量少用sleep的解决方案

xiaoxiao2021-02-28  50

方案1:条件变量

条件等待pthread_cond_wait()

代码示例[1]

#include <unistd.h> #include <pthread.h> static pthread_mutex_t mutex; static pthread_cond_t cond; static int flag = 0; void srpthread_init() { pthread_mutex_init(&mutex,NULL); pthread_cond_init(&cond,NULL); } void srpthread_suspend() { pthread_mutex_lock(&mutex); flag--; pthread_mutex_unlock(&mutex); } void srpthread_resume() { pthread_mutex_lock(&mutex); flag++; pthread_cond_signal(&cond); pthread_mutex_unlock(&mutex); } void *thread_run() { while(1) { pthread_mutex_lock(&mutex); while(flag<=0) { pthread_cond_wait(&cond,&mutex); } pthread_mutex_unlock(&mutex); //actual work printf("i am running!\n"); } } int main(int argc,char *argv[]) { char ch; pthread_t p1; srpthread_init(); pthread_create(&p1,NULL,(void *)thread_run,NULL); while(1) { scanf("%c",&ch); switch(ch) { case 's': srpthread_suspend(); break; case 'r': srpthread_resume(); break; default: break; } } #if 0 printf("1111\n"); srpthread_resume(); printf("2222\n"); sleep(3); printf("3333\n"); srpthread_suspend(); printf("4444\n"); #endif return 1; }

记时等待pthread_cond_timedwait()

略,类似pthread_cond_wait()

方案2:信号量

int sem_wait(sem_t *sem); int sem_trywait(sem_t *sem); int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);

具体应用很简单,可查阅相关资料

方案3:用select让线程沉睡

代码示例[2]

void thread_sleep(unsigned long sleepSecond) { #if (APP_USE_SYS == APP_SYS_LINUX) timeval t_timeval; t_timeval.tv_sec = (sleepSecond / 1000); t_timeval.tv_usec = (sleepSecond % 1000); select(0, NULL, NULL, NULL, &t_timeval); #else Sleep(sleepSecond); #endif return; }

参考文献

[1] https://blog.csdn.net/honghuzhilangzixin/article/details/7908236 [2] https://bbs.csdn.net/wap/topics/360129370

转载请注明原文地址: https://www.6miu.com/read-2499971.html

最新回复(0)