|
【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 分 |
|