谁?
我!
是你?
是我!
你终于来了!
我终于来了!
你终究是来了?
我终究是来了!
你来干什么!
我来写多线程和互斥锁!
多线程在多核处理器可以加快运行时间,在单核处理器上没有什么优势。
线程同步,最常用的是互斥锁、条件变量、信号量和读写锁。
我的这个例子里面,使用漏桶算法,加入互斥锁、条件变量,用来控制数据的流入。程序的功能是计算两个数之间的质数,并且打印出来。
首先建立pthread.c文件,然后开始代码之旅。
质数也叫素数,是只能被1和它本身整除的数,1不算质数。根据这个原则,在代码中通过循环除来判断。废话不多说,直接上代码...额抱歉,我确实觉得发烧友的这个代码样式上来之后不好看,还是把源文件放在附件上面吧。
常用的几个函数:
pthread_create创建新线程;
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++)//该循环判断质数条件
- {
- if(i % j == 0)
- {
- flag = 0;
- break;
- }
- }
- if(flag)
- printf("%d is primern",i);//打印质数
- }
- 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);//创建一个新的线程
- }
- 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[i],NULL);//等待指定的线程结束
- pthread_mutex_destroy(&mutex);//销毁互斥锁
- pthread_cond_destroy(&cond);//销毁条件变量
- exit(0);
- }
复制代码
只有当有线程在等待时才对条件变量进行触发。
在调用 pthread_cond_wait 进行条件变量等待操作时,增加一个互斥变量参数是必要的,这是为了避免线程间的竞争和饥饿情况。但是当条件等待返回时候,需要注意的是一定不要遗漏对互斥变量进行解锁。
在编译的时候要注意,你的文件取名为pthread.c,编译可能会被忽略。
在源码的如下目录/HarmonyOS/applications/sample/camera/app/src有个Makefile文件,打开它,更改如下内容: 原来是helloworld,现在要改成pthread。
在源码的在源码的如下目录/HarmonyOS/applications/sample/camera/app目录下,有个*.gn文件,打开它并修改
然后返回到源码根目录,执行编译命令
- python build.py ipcamera_hi3516dv300 -b debug
复制代码 有人在执行这条命令时后面不加 -b debug,也是能够编译的,但是这样系统在启动后,没法在串***互,想想还是加上吧。
然后烧写文件,使用网口烧录,配置如下
等系统起来后,输入
./bin/camera_app执行
依次打印质数