class ThreadSafeInteger
{
public:ThreadSafeInteger();~ThreadSafeInteger();int waitForChange(int prev);int get();int getIncr(int n = 1);void set(int newval);void poke(void);void incr();void decr();protected:CRITICAL_SECTION m_cs; // 临界区变量,用于变量访问安全CONDITION_VARIABLE m_cv; // 条件变量,用于线程同步int m_val;
};
和函数EnterCriticalSection以及LeaveCriticalSection搭配使用。
对多个线程经常访问的同一个变量m_val,对应建立一个临界变量。访问m_val前一定要保证对应的临界变量是空闲的。
为什么需要线程同步?
消费者线程和生产者线程之间的关系,消费者线程需要消费时向商店发出申请,生产者线程生产完了放进商店给他拿走。
如果没有线程同步,则消费者线程和生产者线程都是使用while(true)各自保持全速待命状态。这样就存在一个问题,CPU占用率过高。
这个时候的解决方法就是根据条件变量阻塞线程,消费者没提出需求之前,就把条件变量置0,生产者线程一直等待,直到他变成了1才开始执行。
和函数SleepConditionVariableCS以及WakeAllConditionVariable搭配使用。
条件变量m_cv处于等待,等待时间是INFINITE,同时为m_cs上锁
ABR/VBV:
rateControlStart()如果输入帧为null时,这个时候encoder在flush
rateControlEnd()完成率控操作时,m_startEndOrder.m_val ++;
rateControlUpdateStats(),编完一半时,m_startEndOrder.m_val ++;主要是用于vbv和ABR的码率统计
CQP/CRF:
compressFrame():CQP/CRF:不使用midframe的信息来调整编码参数,所以编码完成后 m_startEndOrder.m_val ++;
rateControlStart(),确定每一帧的QP,确定前waitfor,线程启动的条件是:m_val == prev
rateControlEnd(),结束一帧的率控,
上一篇:MFC计算线段交点