同步单个写入器和多个读取器方案对共享内存的访问的最佳方法?

时间:2019-01-29 10:50:02

标签: linux posix ipc

我有几个可以访问共享内存块的进程。偶尔只有一个进程会向共享内存写入数据,其他几个进程可能会偶尔从共享内存读取数据。 我不会实现以下情况:

  1. 读取器应等待直到写入器未写入为止,然后才能从共享内存中读取数据;
  2. 写者应该等到没有读者读到它,然后才能写入共享内存;
  3. 读者可以同时从共享内存中读取。

我尝试在共享内存中使用进程共享互斥锁和标志来实现这种情况(进程共享互斥锁用于保护标志):

  1. 当作者想要写入共享内存时: 等待直到读取器标志为0->将写入器标志设置为1->写入共享内存->将写入器标志设置为0
  2. 当读者希望从共享内存中进行读取时: 等待直到写入器标志为0->增加读取器标志->从共享内存中读取->减少读取器标志

代码类似于:

sys.path

作家的写作过程是这样的:

typedef struct {
    pthread_mutex_t rw_mutex;
    int read_flag;
    int write_flag;
} shared_data_t;
void read_start(shared_data_t *p_data)
{   
    while (1)
    {   
        pthread_mutex_lock(&p_data->rw_mutex);
        if (p_data->write_flag <= 0)
        {   
            p_data->read_flag++;
            pthread_mutex_unlock(&p_data->rw_mutex);
            break;
        }
        else
        {
            pthread_mutex_unlock(&p_data->rw_mutex);
            usleep(1);
        }
    }
}

void read_finish(shared_data_t *p_data)
{
    pthread_mutex_lock(&p_data->rw_mutex);
    p_data->read_flag--;
    pthread_mutex_unlock(&p_data->rw_mutex);
}

void write_start(shared_data_t *p_data)
{
    while (1)
    {
        pthread_mutex_lock(&p_data->rw_mutex);
        if (p_data->read_flag <= 0)
        {
            printf("set write flag to 1\n");
            p_data->write_flag = 1;
            pthread_mutex_unlock(&p_data->rw_mutex);
            break;
        }
        else
        {
            pthread_mutex_unlock(&p_data->rw_mutex);
            usleep(1);
        }
    }
}

void write_finish(shared_data_t *p_data)
{
    pthread_mutex_lock(&p_data->rw_mutex);
    p_data->write_flag = 0;
    pthread_mutex_unlock(&p_data->rw_mutex);
}

读者的阅读过程类似于:

write_start(p_data);
//write data
write_finish(p_data);

代码有效,但我尚未测试是否存在任何潜在的错误。

我认为必须有一些更好的方法来实现此方案。 任何建议表示赞赏!

EDIT1: 我试图使用条件信号代替usleep的使用,并且代码看起来更好一些。

read_start(p_data);
//read data
read_finish(p_data);

0 个答案:

没有答案