导航:首页 > 源码编译 > obs源码主函数更换

obs源码主函数更换

发布时间:2023-01-25 01:15:43

㈠ 请高手帮忙解释下这多线程的源代码,每句注释下 #include <stdio.h> #include <stdlib.h>

首先这是一个生产者和消费者问题。

生产者procer负责产生数据,然后通过put操作将数据放到缓冲区buf中。

消费者consumer负责显示数据,通过get操作从缓冲区buf中读取数据。

========》

先看主函数main(),

生产者和消费者分别用两个线程来实现。

主函数中的pthread_create()函数就是用来创建这两个线程的。

开始定义了两个变量th_a,th_b用来记录这两个线程的线程号。

线程的程序体分别是procer,consumer。

接下来的pthread_join用来等待两个线程结束。因为如果不等待,main函数的主线程会立即结束,而两个子线程还来不及完全执行。

=======》

下面来分别看procer,consumer这两个线程。

procer循环一百次,每次调用put往buffer中放数据,最后放一个OVER;

consumer循环用get从buffer中读到数据并打印,直到读取的数据位OVER数据时结束。

=======》

我们再分别来看put操作和get操作。

由于put和get都要访问buf,buf就是一个临界资源,为了解决这个临界资源,在使用buf之前,要对它加锁。

pthread_mutex_lock(b->lock)一个为信号量加锁的函数。每个信号量只能加锁一次(我说的可能不准确),如果执行该函数的时候,参数中的信号量已经被加锁,则该函数阻塞,直到信号量被解锁才继续执行。这样就能保证信号量所保护的临界资源能够被互斥的访问。

structprodcons{

intbuffer[BUFFER_SIZE];/*这个就是循环缓冲区*/

pthread_mutex_tlock;/*这个是信号量,用来保证对缓冲区的互斥访问*/

intreadpos,writepos;/*这两个成员分别表示读位置和写位置*/

pthread_cond_tnotempty;/*这是表示缓冲区“非空”的条件信号量*/

pthread_cond_tnotfull;/*这是表示缓冲区“非满”的条件信号量*/

};

buf是一个循环的缓冲区,我们先来看缓冲区为空和满这两种状态时,读、写标记(readpos,writepos)的位置。

缓冲区为空时,readpos和writepos指在同一位置;

换从去为满时,writepos位置的下一个位置就是readpos。

/*put负责把数据放到缓冲区*/

voidput(structprodcons*b,intdata)

{

//首先对互斥信号量进行加锁

pthread_mutex_lock(&b->lock);

/*这里就是判断缓冲区有没有满,用writepos+1与readpos比较,可以参考附图。

*因为是循环缓冲区,所以要模BUFFER_SIZE。

*如果缓冲区满,将在while中等待,直到缓冲区非满,再继续执行。

*/

while((b->writepos+1)%BUFFER_SIZE==b->readpos){

printf("waitfornotfull ");

//如果已经满了,则等待消费者读取了数据后发出“非满”信号。

pthread_cond_wait(&b->notfull,&b->lock);

}

/*当缓冲区非满时,将数据写入缓冲区中writepos对应的位置*/

b->buffer[b->writepos]=data;

//更新writepos到下一个位置

b->writepos++;

//循环利用缓冲区空间,如果超过了最大值,则从头开始。

if(b->writepos>=BUFFER_SIZE)b->writepos=0;

/*向消费者发送信号,告诉消费者缓冲取非空*/

pthread_cond_signal(&b->notempty);

//对互斥信号进行解锁。

pthread_mutex_unlock(&b->lock);

}

/*--------------------------------------------------------*/

/*get负责从缓冲区中读取数据*/

intget(structprodcons*b)

{

intdata;

//对互斥信号量进行加锁

pthread_mutex_lock(&b->lock);

/*判断缓冲区是否为空,为空则等待*/

while(b->writepos==b->readpos){

printf("waitfornotempty ");

pthread_cond_wait(&b->notempty,&b->lock);

}

/*读取readpos位置的数据*/

data=b->buffer[b->readpos];

//更新readpos到下一个位置。

b->readpos++;

//循环利用缓冲区,回拨指针

if(b->readpos>=BUFFER_SIZE)b->readpos=0;

/*发信号给生产者,缓冲区非满,可以放数据了*/

pthread_cond_signal(&b->notfull);

//对互斥信号量进行解锁

pthread_mutex_unlock(&b->lock);

returndata;

}

阅读全文

与obs源码主函数更换相关的资料

热点内容
2017年程序员前景 浏览:408
ug曲线分割命令 浏览:792
我的世界服务器有人放恶心指令怎么找到 浏览:991
matlab模板匹配算法 浏览:98
华为怎样使用云服务器地址 浏览:105
空调压缩机分解图片 浏览:779
qq飞车音乐所在文件夹 浏览:245
为什么go编译那么快 浏览:313
云耀云服务器中文 浏览:505
p2p借贷服务行业白皮书pdf 浏览:882
服务器lp地址是什么意思 浏览:257
单片机打分器 浏览:838
康德道德学绝对命令 浏览:207
绝地求生如何看自己在哪个服务器 浏览:968
富士通单片机程序下载软件 浏览:860
带平方的运算法则 浏览:944
姜振宇微表情pdf 浏览:392
如何看方舟服务器的倍率 浏览:76
招行app如何设置退出登录 浏览:431
程序员发文章一般多久 浏览:861