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

时间:2018-05-13 16:37:10

标签: c struct mutex

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

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

这就是为什么我来这里获得有关这方面的意见以及如何实现这一目标的提示

为了更好地解释我正在寻找的东西。

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

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

我们说结构是全局定义的

struct SHARED_DATA shared_data = {0};

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

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

1 个答案:

答案 0 :(得分:2)

我不确定我理解你的问题。

如果我理解正确,您不需要整个结构的单个互斥锁,并且您希望将互斥锁打包在结构内。

你可以这样做:

 string pass="your password"
 SecureString password = new SecureString();
        foreach (var item in pass.ToCharArray())
        {
            password.AppendChar(item);
        }
var ctx = new ClientContext("yourSiteName");

ctx.Credentials = new SharePointOnlineCredentials(username, password);

编辑:

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

你可以这样做:

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