亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我想要每1秒輸出一個數,但是執行到Beep函數就會阻塞8秒 ,求多線程方法解決這個問題?

我想要每1秒輸出一個數,但是執行到Beep函數就會阻塞8秒 ,求多線程方法解決這個問題?

天涯盡頭無女友 2023-03-02 22:18:00
我這里有個兩函數int i=0;void fun(){Sleep(1000);printf("%d\n",i);}還有一個void sound(){Beep(2000,8000);//響8秒}
查看完整描述

2 回答

?
慕桂英4014372

TA貢獻1871條經驗 獲得超13個贊

1、使用pthread庫執行多線程,這個是Linux下的線程庫 Windows下應該有自己的API,不過這種東西一般還是以Linux為標準。pthread_create()創建一個線程,傳入fun()的函數指針就行了。

2、例程:


#include <pthread.h>#include <stdio.h>#include <sys/time.h>#include <string.h>#define MAX 10pthread_t thread[2];pthread_mutex_t mut;int number=0, i;void *thread1(){printf ("thread1 : I'm thread 1\n");for (i = 0; i < MAX; i++){printf("thread1 : number = %d\n",number);pthread_mutex_lock(&mut);number++;pthread_mutex_unlock(&mut);sleep(2);}printf("thread1 :主函數在等我完成任務嗎?\n");pthread_exit(NULL);}void *thread2(){printf("thread2 : I'm thread 2\n");for (i = 0; i < MAX; i++){printf("thread2 : number = %d\n",number);pthread_mutex_lock(&mut);number++;pthread_mutex_unlock(&mut);sleep(3);}printf("thread2 :主函數在等我完成任務嗎?\n");pthread_exit(NULL);}void thread_create(void){int temp;memset(&thread, 0, sizeof(thread)); //comment1/*創建線程*/if((temp = pthread_create(&thread[0], NULL, thread1, NULL)) != 0) //comment2printf("線程1創建失敗!\n");elseprintf("線程1被創建\n");if((temp = pthread_create(&thread[1], NULL, thread2, NULL)) != 0) //comment3printf("線程2創建失敗");elseprintf("線程2被創建\n");}void thread_wait(void){/*等待線程結束*/if(thread[0] !=0) { //comment4pthread_join(thread[0],NULL);printf("線程1已經結束\n");}if(thread[1] !=0) { //comment5pthread_join(thread[1],NULL);printf("線程2已經結束\n");}}int main(){/*用默認屬性初始化互斥鎖*/pthread_mutex_init(&mut,NULL);printf("我是主函數哦,我正在創建線程,呵呵\n");thread_create();printf("我是主函數哦,我正在等待線程完成任務阿,呵呵\n");thread_wait();return 0;}


查看完整回答
反對 回復 2023-03-06
?
MMTTMM

TA貢獻1869條經驗 獲得超4個贊

使用pthread庫執行多線程,這個是Linux下的線程庫 Windows下應該有自己的API,不過這種東西一般還是以Linux為標準。pthread_create()創建一個線程,傳入fun()的函數指針就行了。
然后這個Beep()的需求要進行線程間通信,可以用共享內存的方法,設一個bool變量flag共享,然后beep的時候設為false,beep完設成true。fun()里面每次看一下這個flag,是false的話就不做動作等下一秒,基本可以滿足需求。
這樣做的好處是實現簡單,但時間是以1s為單位的。如果要8秒結束立刻執行,需要用條件變量的方法來控制,比較復雜,這樣的實現方式一個可以滿足需求了。

查看完整回答
反對 回復 2023-03-06
  • 2 回答
  • 0 關注
  • 158 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號