猿问

我想要每1秒输出一个数,但是执行到Beep函数就会阻塞8秒 ,求多线程方法解决这个问题?

我这里有个两函数
int i=0;
void fun()
{
Sleep(1000);

printf("%d\n",i);

}
还有一个
void sound()
{
Beep(2000,8000);//响8秒

}

天涯尽头无女友
浏览 117回答 2
2回答

慕桂英4014372

1、使用pthread库执行多线程,这个是Linux下的线程库 Windows下应该有自己的API,不过这种东西一般还是以Linux为标准。pthread_create()创建一个线程,传入fun()的函数指针就行了。2、例程:#include&nbsp;<pthread.h>#include&nbsp;<stdio.h>#include&nbsp;<sys/time.h>#include&nbsp;<string.h>#define&nbsp;MAX&nbsp;10pthread_t&nbsp;thread[2];pthread_mutex_t&nbsp;mut;int&nbsp;number=0,&nbsp;i;void&nbsp;*thread1(){printf&nbsp;("thread1&nbsp;:&nbsp;I'm&nbsp;thread&nbsp;1\n");for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;MAX;&nbsp;i++){printf("thread1&nbsp;:&nbsp;number&nbsp;=&nbsp;%d\n",number);pthread_mutex_lock(&mut);number++;pthread_mutex_unlock(&mut);sleep(2);}printf("thread1&nbsp;:主函数在等我完成任务吗?\n");pthread_exit(NULL);}void&nbsp;*thread2(){printf("thread2&nbsp;:&nbsp;I'm&nbsp;thread&nbsp;2\n");for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;MAX;&nbsp;i++){printf("thread2&nbsp;:&nbsp;number&nbsp;=&nbsp;%d\n",number);pthread_mutex_lock(&mut);number++;pthread_mutex_unlock(&mut);sleep(3);}printf("thread2&nbsp;:主函数在等我完成任务吗?\n");pthread_exit(NULL);}void&nbsp;thread_create(void){int&nbsp;temp;memset(&thread,&nbsp;0,&nbsp;sizeof(thread));&nbsp;//comment1/*创建线程*/if((temp&nbsp;=&nbsp;pthread_create(&thread[0],&nbsp;NULL,&nbsp;thread1,&nbsp;NULL))&nbsp;!=&nbsp;0)&nbsp;//comment2printf("线程1创建失败!\n");elseprintf("线程1被创建\n");if((temp&nbsp;=&nbsp;pthread_create(&thread[1],&nbsp;NULL,&nbsp;thread2,&nbsp;NULL))&nbsp;!=&nbsp;0)&nbsp;//comment3printf("线程2创建失败");elseprintf("线程2被创建\n");}void&nbsp;thread_wait(void){/*等待线程结束*/if(thread[0]&nbsp;!=0)&nbsp;{&nbsp;//comment4pthread_join(thread[0],NULL);printf("线程1已经结束\n");}if(thread[1]&nbsp;!=0)&nbsp;{&nbsp;//comment5pthread_join(thread[1],NULL);printf("线程2已经结束\n");}}int&nbsp;main(){/*用默认属性初始化互斥锁*/pthread_mutex_init(&mut,NULL);printf("我是主函数哦,我正在创建线程,呵呵\n");thread_create();printf("我是主函数哦,我正在等待线程完成任务阿,呵呵\n");thread_wait();return&nbsp;0;}

MMTTMM

使用pthread库执行多线程,这个是Linux下的线程库 Windows下应该有自己的API,不过这种东西一般还是以Linux为标准。pthread_create()创建一个线程,传入fun()的函数指针就行了。然后这个Beep()的需求要进行线程间通信,可以用共享内存的方法,设一个bool变量flag共享,然后beep的时候设为false,beep完设成true。fun()里面每次看一下这个flag,是false的话就不做动作等下一秒,基本可以满足需求。这样做的好处是实现简单,但时间是以1s为单位的。如果要8秒结束立刻执行,需要用条件变量的方法来控制,比较复杂,这样的实现方式一个可以满足需求了。
随时随地看视频慕课网APP
我要回答