電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 762|回復: 0
收起左側(cè)

【HarmonyOS HiSpark AI Camera試用連載 】第三次回眸-鴻蒙的線程和互斥鎖

[復制鏈接]

2607

主題

2607

帖子

7472

積分

高級會員

Rank: 5Rank: 5

積分
7472
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2020-11-13 03:56:32 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
【HarmonyOS HiSpark AI Camera試用連載 】第三次回眸-鴻蒙的線程和互斥鎖,   
本帖最后由 瑟寒凌風 于 2020-11-13 02:25 編輯



誰? 我! 是你? 是我! 你終于來了! 我終于來了! 你終究是來了? 我終究是來了! 你來干什么! 我來寫多線程和互斥鎖!



本文參照https://device.harmonyos.com/cn/ ... ad-0000001050141770提供的API進行編程。 多線程在多核處理器可以加快運行時間,在單核處理器上沒有什么優(yōu)勢。 線程同步,最常用的是互斥鎖、條件變量、信號量和讀寫鎖。 我的這個例子里面,使用漏桶算法,加入互斥鎖、條件變量,用來控制數(shù)據(jù)的流入。程序的功能是計算兩個數(shù)之間的質(zhì)數(shù),并且打印出來。 首先建立pthread.c文件,然后開始代碼之旅。

質(zhì)數(shù)也叫素數(shù),是只能被1和它本身整除的數(shù),1不算質(zhì)數(shù)。根據(jù)這個原則,在代碼中通過循環(huán)除來判斷。廢話不多說,直接上代碼...額抱歉,我確實覺得發(fā)燒友的這個代碼樣式上來之后不好看,還是把源文件放在附件上面吧。 常用的幾個函數(shù): pthread_create創(chuàng)建新線程; pthread_mutex_lock互斥鎖加鎖操作; pthread_cond_wait等待條件; pthread_cond_signal解除被阻塞的線程;

  • #include <stdio.h>
      
  • #include <stdlib.h>
      
  • #include <pthread.h>
      
  • #define MIN         30000000
      
  • #define MAX         30000200
      
  • #define THRNUM        3
      
  • static int num = 0;
      
  • static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
      
  • static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
      
  • void *func(void *arg)
      
  • {
      
  •         int i,j,flag;
      
  •         while(1)
      
  •         {
      
  •                 pthread_mutex_lock(&mutex);//互斥鎖加鎖操作
      

  •   
  •                 while(num == 0)
      
  •                 {        
      
  •                         pthread_cond_wait(&cond,&mutex);//等待條件
      
  •                 }
      
  •                
      
  •                 if(num == -1)
      
  •                 {
      
  •                         pthread_mutex_unlock(&mutex);//互斥鎖解鎖
      
  •                         break;
      
  •                 }
      
  •                 i = num;
      
  •                 num = 0;
      
  •                 pthread_cond_broadcast(&cond);//解除若干已被等待條件阻塞的線程
      
  •                 pthread_mutex_unlock(&mutex);//互斥鎖解鎖操作
      
  •                 flag = 1;
      
  •                 for(j = 2; j < i/2; j++)//該循環(huán)判斷質(zhì)數(shù)條件
      
  •                 {
      
  •                         if(i % j == 0)
      
  •                         {
      
  •                                 flag = 0;
      
  •                                 break;
      
  •                         }
      
  •                 }
      
  •                 if(flag)
      
  •                         printf(“%d is primer\n“,i);//打印質(zhì)數(shù)
      
  •         }
      
  •         pthread_exit(NULL);
      
  • }
      
  • int main(void)
      
  • {
      
  •         pthread_t tid[THRNUM];
      
  •         int i;
      
  •         for(i = 0; i < THRNUM; i++)
      
  •         {
      
  •                 pthread_create(tid+i,NULL,func,NULL);//創(chuàng)建一個新的線程
      
  •         }
      
  •         for(i = MIN; i <= MAX; i++)
      
  •         {
      
  •                 pthread_mutex_lock(&mutex);//互斥鎖加鎖操作
      
  •                 while(num != 0)
      
  •                 {
      
  •                         pthread_cond_wait(&cond,&mutex);//等待條件
      
  •                 }
      

  •   
  •                 num = i;
      
  •                 pthread_cond_signal(&cond);//解除被阻塞的線程
      
  •                 pthread_mutex_unlock(&mutex);//互斥鎖解鎖操作
      
  •         }
      
  •         pthread_mutex_lock(&mutex);//互斥鎖加鎖操作
      
  •         while(num != 0)
      
  •         {
      
  •                 pthread_cond_wait(&cond,&mutex);//等待條件
      
  •         }
      
  •         num = -1;
      
  •         pthread_cond_signal(&cond);//解除被阻塞的線程
      
  •         pthread_mutex_unlock(&mutex);//互斥鎖解鎖操作
      
  •         for(i = 0 ; i < THRNUM; i++)
      
  •                 pthread_join(tid,NULL);//等待指定的線程結(jié)束
      
  •         pthread_mutex_destroy(&mutex);//銷毀互斥鎖
      
  •         pthread_cond_destroy(&cond);//銷毀條件變量
      
  •         exit(0);
      
  • }
      

  •   


復制代碼

只有當有線程在等待時才對條件變量進行觸發(fā)。

在調(diào)用 pthread_cond_wait 進行條件變量等待操作時,增加一個互斥變量參數(shù)是必要的,這是為了避免線程間的競爭和饑餓情況。但是當條件等待返回時候,需要注意的是一定不要遺漏對互斥變量進行解鎖。 在編譯的時候要注意,你的文件取名為pthread.c,編譯可能會被忽略。 在源碼的如下目錄/HarmonyOS/applications/sample/camera/app/src有個Makefile文件,打開它,更改如下內(nèi)容:

1.png (132.28 KB, 下載次數(shù): 0)

下載附件  保存到相冊  

1 小時前 上傳 原來是helloworld,現(xiàn)在要改。 <span]

2.png (94.82 KB, 下載次數(shù): 0)

下載附件  保存到相冊  

1 小時前 上傳 然后返回到源碼根目錄,執(zhí)行編譯命令

  • python build.py ipcamera_hi3516dv300 -b debug

復制代碼 有人在執(zhí)行這條命令時后面不加 -b debug,也是能夠編譯的,但是這樣系統(tǒng)在啟動后,沒法在串口交互,想想還是加上吧。

然后燒寫文件,使用網(wǎng)口燒錄,配置如下



3.png (64.22 KB, 下載次數(shù): 0)

下載附件  保存到相冊  

1 小時前 上傳

等系統(tǒng)起來后,輸入
./bin/camera_app執(zhí)行


依次打印質(zhì)數(shù)



4.png (14.42 KB, 下載次數(shù): 0)

下載附件  保存到相冊  

1 小時前 上傳







pthread.c
(1.73 KB, 下載次數(shù): 0) 1 小時前 上傳 點擊文件名下載附件

下載積分: 積分 -1 分
回復

使用道具 舉報

發(fā)表回復

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表