我有几个可以访问共享内存块的进程。偶尔只有一个进程会向共享内存写入数据,其他几个进程可能会偶尔从共享内存读取数据。 我不会实现以下情况:
我尝试在共享内存中使用进程共享互斥锁和标志来实现这种情况(进程共享互斥锁用于保护标志):
代码类似于:
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);