Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用pthread\u mutex\u lock锁定资源意味着什么?_C_Multithreading_Pthreads_Mutex - Fatal编程技术网

使用pthread\u mutex\u lock锁定资源意味着什么?

使用pthread\u mutex\u lock锁定资源意味着什么?,c,multithreading,pthreads,mutex,C,Multithreading,Pthreads,Mutex,我是多线程新手,我很难理解互斥 这里是pthread_mutex_lock的原型 int pthread_mutex_lockpthread_mutex_t*mutex 手册页说,应该通过调用pthread_mutex_lock来锁定mutex引用的mutex对象 首先,我的理解是使用互斥锁来锁定共享资源,以便在任何时候只有一个线程可以访问它。为了便于讨论,我们假设共享资源是一个名为myVariable的全局变量。现在,如果我们想锁定myVariable,我应该能够使用锁定机制来锁定myVari

我是多线程新手,我很难理解互斥

这里是pthread_mutex_lock的原型

int pthread_mutex_lockpthread_mutex_t*mutex

手册页说,应该通过调用pthread_mutex_lock来锁定mutex引用的mutex对象

首先,我的理解是使用互斥锁来锁定共享资源,以便在任何时候只有一个线程可以访问它。为了便于讨论,我们假设共享资源是一个名为myVariable的全局变量。现在,如果我们想锁定myVariable,我应该能够使用锁定机制来锁定myVariable,但是锁定互斥对象意味着什么呢?我的意思是,如果我调用pthread\u mutex\u lock&someMutex,我是锁定myVariable还是其他什么

总之,如果我想使用互斥,难道我不应该像pthread\u mutex\u lockmyVariable那样做,而不是像pthread\u mutex\u lock&someMutex那样做吗

还有,这个someMutex对象如何对应于myVariable?这个someMutex对象如何锁定对myVariable的访问

另外,假设我在它之前声明了someMutex

p.p.S.我有一种感觉,这个问题可能很宽泛,但话说回来,它不应该如此,因为我问的问题实际上有一个特定的答案。如果我错了,请纠正我。

someMutex基本上只是一个数字变量,它不直接对应于myVariable

一般序贯概念

lock(someMutex) {
    while (someMutex != 0) {}
    someMutex = 1;
}

unlock(someMutex) {
    someMutex = 0;
}
someMutex基本上只是一个数值变量,它并不直接对应于myVariable

一般序贯概念

lock(someMutex) {
    while (someMutex != 0) {}
    someMutex = 1;
}

unlock(someMutex) {
    someMutex = 0;
}

互斥体不知道互斥体和它所保护的对象之间的关联,也不必知道。假设我们有两个人在合作,他们需要共用一辆车。我们不希望一个人在另一个人使用汽车时试图使用它。他们可以制定一个简单的规则——除非你手里拿着红萝卜,否则不要乱动汽车。因为只有一个人可以拿着萝卜,这可以确保他们在使用汽车时不会相互冲突。萝卜不必知道它在保护汽车。只要他们俩都不碰汽车,除非是他们拿着萝卜,否则萝卜会保护汽车

互斥是萝卜。锁定互斥锁会抓住萝卜,等待对方在需要时放下萝卜。解锁互斥锁会将萝卜放在其他人可以得到的地方


互斥保护的变量或对象是汽车。萝卜保护汽车不是因为萝卜做了什么,而是因为每个人都遵守规则,除非你有萝卜,否则不要碰汽车。互斥体保护对象也是如此。

互斥体不知道互斥体与其保护对象之间的关联,也不必知道。假设我们有两个人在合作,他们需要共用一辆车。我们不希望一个人在另一个人使用汽车时试图使用它。他们可以制定一个简单的规则——除非你手里拿着红萝卜,否则不要乱动汽车。因为只有一个人可以拿着萝卜,这可以确保他们在使用汽车时不会相互冲突。萝卜不必知道它在保护汽车。只要他们俩都不碰汽车,除非是他们拿着萝卜,否则萝卜会保护汽车

互斥是萝卜。锁定互斥锁会抓住萝卜,等待对方在需要时放下萝卜。解锁互斥锁会将萝卜放在其他人可以得到的地方


互斥保护的变量或对象是汽车。萝卜保护汽车不是因为萝卜做了什么,而是因为每个人都遵守规则,除非你有萝卜,否则不要碰汽车。互斥体保护对象也是如此。

互斥体保护一个代码区域,因此一次只能有一个执行线程执行该区域

互斥锁是一个基本的构建块,应用互斥锁以获得所需的结果是您的责任

如果要更改共享变量,可以执行以下操作:

void changeit(int val)
{
    pthread_mutex_lock(&someMutex);
    global_variable = val;
    pthread_mutex_unlock(&someMutex);
}
这部分意味着在锁止/解锁互斥锁之间,每次只有1个线程执行代码。这是为了确保

全局变量=val;是以原子方式运行的,例如,如果同时运行2个赋值,则无法保证结果会有任何有意义的值 不能保证单个赋值语句是以原子方式执行的,或作为汇编代码/机器代码中的一条指令执行

任何读取GULLALL变量的人都会在某人改变之前或完全完成之后,所以他们看不到任何被改变的值。

这也意味着任何其他访问全局变量读取和/或写入的人也必须在相同的情况下这样做 互斥锁已锁定,例如,要读取变量,可以执行以下操作:

int readit(void)
{
    int val;
    pthread_mutex_lock(&someMutex);
    val = global_variable;
    pthread_mutex_unlock(&someMutex);
    return val;
}
因此,someMutex只以您编写代码的方式对应全局_变量,它依赖于您,程序员,来正确地执行它-全局_变量和someMutex之间没有内在的联系


如果两个变量连接在一起对您的程序有意义,并且必须始终一起读取或写入,则互斥锁允许您这样做-而不是像上面的代码所示读取/写入单个变量,您可以在保持互斥锁的同时读取/更改两个变量。同样,互斥体对这两个变量一无所知,其效果完全取决于代码的结构。

互斥体保护一个代码区域,因此一次只有一个执行线程执行该区域

互斥锁是一个基本的构建块,应用互斥锁以获得所需的结果是您的责任

如果要更改共享变量,可以执行以下操作:

void changeit(int val)
{
    pthread_mutex_lock(&someMutex);
    global_variable = val;
    pthread_mutex_unlock(&someMutex);
}
这部分意味着在锁止/解锁互斥锁之间,每次只有1个线程执行代码。这是为了确保

全局变量=val;是以原子方式运行的,例如,如果同时运行2个赋值,则无法保证结果会有任何有意义的值 不能保证单个赋值语句是以原子方式执行的,或作为汇编代码/机器代码中的一条指令执行

任何读取GULLALL变量的人都会在某人改变之前或完全完成之后,所以他们看不到任何被改变的值。

这也意味着,当同一互斥锁被锁定时,访问读取和/或写入全局_变量的任何其他人也必须这样做,例如,要读取变量,您可以执行以下操作:

int readit(void)
{
    int val;
    pthread_mutex_lock(&someMutex);
    val = global_variable;
    pthread_mutex_unlock(&someMutex);
    return val;
}
因此,someMutex只以您编写代码的方式对应全局_变量,它依赖于您,程序员,来正确地执行它-全局_变量和someMutex之间没有内在的联系


如果两个变量连接在一起对您的程序有意义,并且必须始终一起读取或写入,则互斥锁允许您这样做-而不是像上面的代码所示读取/写入单个变量,您可以在保持互斥锁的同时读取/更改两个变量。同样,互斥体对这两个变量一无所知,其效果完全取决于代码的结构。

互斥体最初被描述为类似于儿童游戏Button Button,它得到了按钮。只有当您有按钮时,才允许触摸共享资源。。。互斥锁是按钮,当pthread_Mutex_锁成功时,您将从逻辑上获得它。然后可以读取或修改共享资源。完成后,您将解锁互斥锁,从而使其他线程可以使用它。注意:这是一个过于简单的/初学者/不完整的描述,但应该可以让您开始。哦,在这种情况下,我可以说使用相同的互斥锁锁定不同的变量吗?比如我可以调用pthread\u mutex\u lock&someMutex来锁定我的变量和你的变量吗?由于互斥不是特定于您所说的特定变量或资源,我应该能够使用单个互斥来处理程序中的所有内容,对吗?例如,您可以使用单个互斥来控制对所有全局变量的所有访问。。。您必须考虑所有线程可能需要访问互斥体保护的共享资源的频率。这是一个设计决策,决定您需要多少互斥体以及它们将锁定什么。互斥体不锁定共享资源,而是锁定代码部分。这取决于程序员,以确保任何共享资源都只会被相应的互斥锁锁定的代码段所触及。互斥锁最初被描述为类似于儿童游戏Button Button,它得到了按钮。只有当您有按钮时,才允许触摸共享资源。。。互斥锁是按钮,当pthread_Mutex_锁成功时,您将从逻辑上获得它。然后可以读取或修改共享资源。完成后,您将解锁互斥锁,从而使其他线程可以使用它。注意:这是一个过于简单的/初学者/不完整的描述,但应该可以让您开始。哦,在这种情况下,我可以说使用相同的互斥锁锁定不同的变量吗?比如我可以调用pthread\u mutex\u lock&someMutex来锁定我的变量和你的变量吗?由于互斥不是特定于您所说的特定变量或资源,我应该能够使用单个互斥来处理程序中的所有内容,对吗?例如,您可以使用单个互斥来控制对所有全局变量的所有访问。。。您必须考虑所有线程可能需要访问互斥体保护的共享资源的频率。这是一个设计决策,决定您需要多少互斥体以及它们将锁定什么。互斥体不锁定共享资源,而是锁定代码部分。由程序员来确保任何共享资源都是onl
你曾经接触过被相应的互斥锁锁定的代码段。不需要萝卜来保护汽车。有一条更简单的规则:除非你坐在驾驶座上,否则不要开车。但我可以从现实生活中举出一个类似的例子:在过去的几天里,许多开发人员希望对某个共享文件进行更改,我就听说过软件项目。他们会有一顶特别的帽子,挂在项目经理的办公室里。规则是,除非你戴着帽子,否则不要编辑文件。不需要萝卜来保护汽车。有一条更简单的规则:除非你坐在驾驶座上,否则不要开车。但我可以从现实生活中举出一个类似的例子:在过去的几天里,许多开发人员希望对某个共享文件进行更改,我就听说过软件项目。他们会有一顶特别的帽子,挂在项目经理的办公室里,规则是,除非你戴着帽子,否则不要编辑文件。