linux 线程同步

来源:互联网 发布:淘宝衣服评价语20字 编辑:程序博客网 时间:2024/06/15 18:25

多线程之间的同步方式有以下几种选择:

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 );


0 0