多线程之间的同步方式有以下几种选择:
1.通过互斥锁实现。
int pthread_mutex_init(pthread_mutex_t *mp, const pthread_mutexattr_t *mattr)
int pthread_mutex_lock(pthread_mutex_t *mutex); #include pthread_mutex_t mutex; int ret; ret = pthread_ mutex_lock(&mp); /* acquire the mutex */
int pthread_mutex_unlock(pthread_mutex_t *mutex); #include pthread_mutex_t mutex; int ret; ret = pthread_mutex_unlock(&mutex); /* release the mutex */
2.通过事件通知方式实现,举例如下:
a. 创建文件描述符
g_fd_pcm_capture_request = eventfd ( 0, EFD_SEMAPHORE );
b.在资源消费线程中等待事件
eventfd_t eventfd_value;
result = eventfd_read ( g_fd_pcm_capture_request, &eventfd_value );
if(0 != result)
{
printf( "[%s]%d: read pcm eventfd [%d] failed!\n", __func__, __LINE__, audio_index);
return -1;
}
c.在资源生产线程 / 回调函数中产生事件
eventfd_write ( g_fd_pcm_capture_request, 1 );
3. 通过线程条件变量 pthread_cond_t 实现
自定义结构体如下 (需要注意的是 pthread_cond_t 和 pthread_mutex_t 总是捆绑使用)
typedef struct
{
void **queue;
int size;
pthread_mutex_t mutex;
pthread_cond_t in_cv;
pthread_cond_t out_cv;
} obe_queue_t;
a.初始化条件变量
void obe_init_queue( obe_queue_t *queue )
{
pthread_mutex_init( &queue->mutex, NULL );
pthread_cond_init( &queue->in_cv, NULL );
pthread_cond_init( &queue->out_cv, NULL );
queue->size = 0;
}
b.在资源消费线程中等待:
pthread_cond_wait( &pstMuxer->emMuxQueue.in_cv, &pstMuxer->emMuxQueue.mutex );
c。在资源生产线程/回调函数中改变条件:
pthread_mutex_lock( &queue->mutex );
pthread_cond_signal( &queue->in_cv );
pthread_mutex_unlock( &queue->mutex );