日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NDK学习笔记-多线程与生产消费模式

發布時間:2025/3/20 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NDK学习笔记-多线程与生产消费模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在做NDK開發的時候,很多情況下都是需要使用多線程的,一方面是提高程序運行效率,另一方面就是防止主線程阻塞

C的多線程

在C語言里,可以通過對于POSIX標準的運用,使得C語言執行多線程
提高程序的執行速度,以及對資源的合理利用

POSIX

POSIX原理

POSIX可以讓C語言實現多線程
其實現是是通過POSIX函數庫的調用實現的
POSIX函數庫可以看作是C語言庫函數的超集,對C語言盡行了增強

POSIX實現多線程

在C語言中調用POSIX庫函數可以實現多線程
在使用時,需要包含pthread.h頭文件
其步驟為:

  • 創建線程ID,使用pthread_t創建線程ID
pthread_t tid;
  • 創建線程,使用pthread_create()創建線程
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);
  • 結束線程
    線程依附于主線程,主線程結束,其子線程也就結束了
    要使主線程等待子線程運行完畢,就需要使用pthread_join()函數
int pthread_join(pthread_t thread, void **retval);

另外,在線程運行的時候可以結束線程,可以通過以下函數結束正在運行的線程

void pthread_exit(void *retval); int pthread_cancel(pthread_t thread);

e.g.

#include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <pthread.h>void* thr_fun(void* arg){char* buf = (char*)arg;int i = 0;for(; i < 100; i++){printf("%s thread -%d-\n", buf, i);usleep(1000);}return "thread over\n"; }void main(){pthread_t tid; //創建線程IDpthread_create(&tid, NULL, thr_fun, "pass"); //創建線程并執行thr_fun函數int i = 0;for(; i < 100; i++){printf("main thread -%d-\n", i);usleep(1000);}void* rval;pthread_join(tid, &rval); //等待線程執行完畢printf("get from thread:%s", (char *)rval); }

上述示例在加入usleep是為了主線程和子線程都能夠輸出
注意:在編譯有posix標準庫多線程的時候,應該添加-lpthread參數,否則會報錯

/tmp/ccEEnOE4.o: In function `main': threadtest.c:(.text+0x7f): undefined reference to `pthread_create' threadtest.c:(.text+0xc3): undefined reference to `pthread_join' collect2: error: ld returned 1 exit status

互斥鎖

為了線程的安全,給線程加上互斥鎖,這樣就可以確保線程安全
線程鎖的作用就是在一個線程進行訪問的時候,不允許其他線程進入

#include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <pthread.h>int count = 0; pthread_mutex_t mutex; //聲明互斥鎖void* thr_fun(void* arg){pthread_mutex_lock(&mutex); //加鎖char *buf = (char*)arg;for(;count < 5; count++){printf("thread:%s, count:%d\n", buf, count);}count = 0;pthread_mutex_unlock(&mutex); //解鎖 }void main(){pthread_t tid1, tid2;pthread_mutex_init(&mutex, NULL); //初始化互斥鎖pthread_create(&tid1, NULL, thr_fun, "thread-1");pthread_create(&tid2, NULL, thr_fun, "thread-2");pthread_join(tid1, NULL);pthread_join(tid2, NULL);pthread_mutex_destroy(&mutex); //銷毀互斥鎖 }

生產者與消費者

  • 當存在多個線程對同一數據進行操作的時候,那么這個數據如果同時被多個線程操作,就會產生安全問題
  • 比如線程A在訪問數據的時候丟失了CPU的控制權,此時線程B去操作了數據,那么線程A在重新得到CPU控制權的時候,其渠道的數據就是線程B操作過的數據,可能其數據并不是預期要取的值
  • 面對這種情況,在設計模式里面就提出了生產者與消費者模型,這也是很常用的一種模型

單個生產者與單個消費者

這種情況下,只需要滿足生產者生產出來能及時被消費者消費
其生產者應該上鎖,生產,通知消費者,解鎖,然后按照這個流程不斷循環
消費者應該上鎖,消費,通知生產者,解鎖,然后按照這個流程不斷循環
全局變量

int ready = 0; int product_idx = 0, consumer_idx = 0; pthread_mutex_t mutex; pthread_cond_t has_product;

生產者方法

void* producer(void* arg){char *buf = (char *)arg;while(1){pthread_mutex_lock(&mutex); //上鎖ready++; //生產product_idx++;printf("%5d%s----%d\n", product_idx, buf, ready);pthread_cond_signal(&has_product); //通知消費者,會阻塞pthread_mutex_unlock(&mutex); //解鎖usleep(100 * 1000);} }

消費者方法

void* consumer(void* arg){char *buf = (char *)arg;while(1){pthread_mutex_lock(&mutex); //上鎖while(ready == 0){pthread_cond_wait(&has_product,&mutex); //線程等待}ready--; //消費consumer_idx++;printf("%5d%s----%d\n", consumer_idx, buf, ready);pthread_mutex_unlock(&mutex); //解鎖usleep(100 * 1000);} }

主方法

void main() {pthread_t pro_id, con_id;pthread_mutex_init(&mutex, NULL);pthread_cond_init(&has_product, NULL);pthread_create(&pro_id, NULL, producer, "producer");pthread_create(&con_id, NULL, consumer, "consumer");pthread_join(pro_id, NULL);pthread_join(con_id, NULL);pthread_mutex_destroy(&mutex);pthread_cond_destroy(&has_product); }

以上方法就實現了線程的安全,在生產者有產品的時候通知消費者,消費者完成消費等待生產者

多個生產者與多個消費者

由于上面已經說明原理,這里直接貼出代碼

#include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <pthread.h>int ready = 0;#define CONSUMER_NUM 4 //消費者數量 #define PRODUCER_NUM 3 //生產者數量 pthread_t pids[CONSUMER_NUM + PRODUCER_NUM];pthread_mutex_t mutex; //互斥鎖 pthread_cond_t has_product; //條件變量void* producer(void* arg){int *num = (int *)arg;while(1){pthread_mutex_lock(&mutex); //上鎖ready++; //生產printf("%5d---product---%d\n", num, ready);pthread_cond_signal(&has_product); //通知消費者,會阻塞pthread_mutex_unlock(&mutex); //解鎖usleep(100 * 1000);} }void* consumer(void* arg){int *num = (int *)arg;while(1){pthread_mutex_lock(&mutex); //上鎖while(ready == 0){pthread_cond_wait(&has_product, &mutex); //線程等待}ready--; //消費printf("%5d---consumer---%d\n", num, ready);pthread_mutex_unlock(&mutex); //解鎖usleep(100 * 1000);} }void main() {pthread_mutex_init(&mutex, NULL);pthread_cond_init(&has_product, NULL);int i;for(i = 0; i < PRODUCER_NUM; i++){ //生產者線程pthread_create(&pids[i], NULL, producer, (void*)i);}for(i = 0; i < CONSUMER_NUM; i++){ //消費者線程pthread_create(&pids[PRODUCER_NUM + i], NULL, consumer, (void*)i);}sleep(10);for(i = 0; i < PRODUCER_NUM + CONSUMER_NUM; i++){pthread_join(pids[i], NULL);} pthread_mutex_destroy(&mutex);pthread_cond_destroy(&has_product); }

轉載于:https://www.cnblogs.com/cj5785/p/10664651.html

總結

以上是生活随笔為你收集整理的NDK学习笔记-多线程与生产消费模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日本视频不卡 | 人妖天堂狠狠ts人妖天堂狠狠 | 色一情一区二区三区四区 | 午夜污片 | 国产熟女一区二区三区五月婷 | 99热在线国产 | 亚洲人成电影网 | 国产高h视频 | 亚洲精品人妻无码 | 麻豆国产免费 | 乱短篇艳辣500篇h文最新章节 | 天天干天天操天天碰 | 91精品视频免费观看 | 日本高清视频网站 | 国产精品骚 | 欧美怡红院一区二区三区 | 久久久久亚洲av成人片 | 欧美三级网 | 国产精品毛片在线 | 精品香蕉一区二区三区 | 国产日产精品一区二区三区 | 久久成人久久 | 99re这里只有精品在线观看 | 丝袜 中出 制服 人妻 美腿 | 国产三区四区视频 | 大尺度做爰呻吟62集 | 精品人体无码一区二区三区 | 99精品中文字幕 | 国产成人日韩 | 美女大黄网站 | 欧美bbbbbbbbbbbb18av | 日韩人妻精品无码一区二区三区 | 欧美专区亚洲专区 | 色综合久久88色综合天天 | 91丝袜| 亚洲免费高清视频 | 久久免费视频99 | 欧美人与禽猛交乱配视频 | 香蕉视频免费网站 | av青娱乐 | www.久久久久久久久 | 91久久伊人 | 成人黄色在线视频 | 激情综合影院 | 国产黄色自拍视频 | 影音先锋在线观看视频 | 神马午夜伦理影院 | 精品久久久久久久中文字幕 | 91一区二区国产 | 成人在线观看免费爱爱 | 国产超碰在线 | 国模私拍视频在线 | 性猛交╳xxx乱大交 偷偷操不一样的久久 | www.九色 | www在线播放 | 久久久精品人妻一区二区三区四 | 国产在线区 | а√在线中文网新版地址在线 | 日本伦理一区 | 一级网站在线观看 | 福利在线一区二区三区 | 国产精品一亚洲av日韩av欧 | 国产做爰免费观看视频 | 中文字幕在线播放日韩 | 天天天天天天干 | 超碰在线播放97 | 日韩免费视频一区 | 免费一级特黄3大片视频 | 自宅警备员在线观看 | www日本免费 | 真性中出 | 大陆明星乱淫(高h)小说 | 日韩精品电影一区 | 好紧好爽再浪一点视频 | 黑人和白人做爰 | 亚洲中午字幕 | 中文字幕免费高清在线观看 | 亚洲91精品 | 国产偷人爽久久久久久老妇app | 小少妇哺乳喂奶播放 | 91在线免费网站 | 欧美日韩综合一区 | 北条麻妃一区二区三区免费 | 精品久久久噜噜噜久久久 | 成人a在线观看 | 久久精品视频16 | 99热网站| 丝袜 亚洲 另类 国产 制服 | 国产黄色av片 | 日韩中文字幕亚洲 | 韩日一区二区三区 | 国产女人视频 | 日韩极品视频在线观看 | 美女扒开尿口让男人捅爽 | 国产艳妇疯狂做爰视频 | 无人在线观看的免费高清视频 | 欧美一区二区三区粗大 | 痴汉电车在线播放 | 校园春色亚洲 |