gpt4 book ai didi

C如何打包互斥锁访问函数内部的结构

转载 作者:太空宇宙 更新时间:2023-11-04 07:55:36 24 4
gpt4 key购买 nike

我有一个代码实现了共享一系列简单计数器的线程,我将它们分组在一个结构中以稍微整理一下代码。所以现在我必须通过它的名字访问结构内部的计数器,但同时用互斥锁锁定结构。到目前为止一切顺利,但出于维护原因和代码简单性,我想将结构的互斥锁和对其任何成员的访问打包在一个函数中,我将成员的名称用作输入参数我希望阅读或更改的内容。

我不知道这是否可行,甚至是否方便,我的意思是对所有线程共享的所有计数器使用单个互斥体可能不是一个好主意,因为单个计数器通常仅由两个线程使用。

所以这就是为什么我来这里是为了征求对此的意见以及如何实现这一点的提示


为了更好地解释我在寻找什么。

我有一个在不同线程上共享的计数器结构

struct SHARED_DATA
{
unsigned int counter1;
unsigned int counter2;
unsigned int counter3;
}

假设结构是全局定义的

struct SHARED_DATA shared_data = {0};

所以,我必须单独访问计数器,但我想打包对成员的访问,同时锁定带有互斥锁的结构,所有这些都在函数内部,输入参数是成员的名称我想阅读或更新的结构。像这样

unsigned int Read_Counters(const char counter)
{
unsigned int value;
pthread_mutex_lock(pthread_mutex_shared_data);
value = shared_data.counter;
pthread_mutex_unlock(pthread_mutex_shared_data);
return value;
}

最佳答案

我不确定我是否理解您的问题。

如果我理解正确的话,您不希望整个结构有一个互斥量,而是希望将互斥量打包在结构内部。

你可以这样做:

typedef struct{ 
int shared1;
pthread_mutex_t mutex1;
int shared2;
pthread_mutex_t mutex2;
} shared_resources;

void touch_shared_esources(shared_resources* shared_things) {
pthread_mutex_lock(&shared_things->mutex1);
shared_things->shared1++;
pthread_mutex_unlock(&shared_things->mutex1);
}

编辑:

所以,你想要一个函数来负责读取结构的值,对吧?

你可以这样做:

void read() {
static pthread_mutex_t mutex;
pthread_mutex_lock(&mutex);
// do things to shared data
pthread_mutex_unlock(&mutex);
}

关于C如何打包互斥锁访问函数内部的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50318337/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com