我是靠谱客的博主 帅气鞋垫,最近开发中收集的这篇文章主要介绍pthread mutex cond 进程间共享(PTHREAD_PROCESS_SHARED)性能探究,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

pthread中提供了pthread_mutex_t互斥锁 和 pthread_cond_t条件变量,我们通常在同一进程不同线程中使用,很少在进程间使用,这次通过实现一个生产者解锁多个阻塞消费者的例子来展示下用法。

 

由于pthread_mutex_t不提供通过名称来在进程间共享的功能,我们通过共享内存的方式来达到共享。注意的是要指定PTHREAD_PROCESS_SHARED

struct SHM_Data
{
    pthread_mutex_t mutex;
    pthread_cond_t cond;
};
// 打开共享内存
shm_fd_ = shm_open(shm_path_.c_str(), O_CREAT | O_RDWR | O_TRUNC, 0777);
if (shm_fd_ < 0)
{
    printf("shm_open  failedn");
    return false;
}
uint64_t size = sizeof(SHM_Data);
if (ftruncate(shm_fd_, size) == -1)
{
    printf("ftruncate  failedn");
    return false;
}
shm_data_ = (SHM_Data *)mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd_, 0);
if (shm_data_ == MAP_FAILED)
{
    printf("mmap  failedn");
    return false;
}
pthread_mutexattr_t attrmutex;
pthread_mutexattr_init(&attrmutex);
pthread_mutexattr_setpshared(&attrmutex, PTHREAD_PROCESS_SHARED);

pthread_mutex_init(&shm_data_->mutex, &attrmutex);
printf("pthread_mutex_init  successn");

pthread_condattr_t attrcond;
pthread_condattr_init(&attrcond);
pthread_condattr_setpshared(&attrcond, PTHREAD_PROCESS_SHARED);
pthread_cond_init(&shm_data_->cond, &attrcond);

while (true) {
    
    timeval tv;
    gettimeofday(&tv, NULL);
    printf("%ldn", tv.tv_usec);
    pthread_mutex_lock(&shm_data_->mutex);
    pthread_cond_broadcast(&shm_data_->cond);
    pthread_mutex_unlock(&shm_data_->mutex);
    sleep(1);
}

消费者通过相同的共享内存映射结构体,就可以在mutex 和cond上进行wait。和普通使用没有什么区别

shm_fd_ = shm_open(shm_path_.c_str(), O_RDWR, 0777);
if (shm_fd_ < 0)
{
    printf("shm_open  failedn");
    return false;
}

SHM_Data *shm_info_ = (SHM_Data *)mmap(NULL, sizeof(SHM_Data), PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd_, 0);
if (shm_info_ == MAP_FAILED)
{
    printf("mmap info failedn");
    return false;
}



while (true) {
    timeval tv;
    gettimeofday(&tv, NULL);
    printf("%ldn", tv.tv_usec);
    pthread_mutex_lock(&shm_data_->mutex);
    pthread_cond_wait(&shm_data_->cond, &shm_data_->mutex);
    pthread_mutex_unlock(&shm_data_->mutex);
}

经过测试发现,消费者解锁和有名信号量解锁以及inotify解锁的方式基本等价,大概在40-80us之间波动。

最后

以上就是帅气鞋垫为你收集整理的pthread mutex cond 进程间共享(PTHREAD_PROCESS_SHARED)性能探究的全部内容,希望文章能够帮你解决pthread mutex cond 进程间共享(PTHREAD_PROCESS_SHARED)性能探究所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(73)

评论列表共有 0 条评论

立即
投稿
返回
顶部