本荣数码网,分享日用电子产品资讯,数码科技电脑类测评。
您现在的位置是:首页 > 产品评测

代码参数互斥 互斥锁的设置协议

vnshog9462 2024-04-16

一、c#互斥问题

首先你的代码应用出现了两个知识点

1、lock加锁:它可以把一段代码定义为互斥段,互斥段在一个时刻内只允许“一个线程”进入执行,而其他线程必须等待。形成互斥有效范围就是{}之间,当代码执行到}之后锁定就会解除。

2、函数的递归调用。test(i);

根据两个技术点特性,可以可定你当i>10的时候,会进行函数递归,但是不会出现死锁,因为:lock只会生效于多线程,对于单线程,自身已经是锁的所有者,并不会出现为了继续加锁等待原有锁释放。

二、互斥锁的设置协议

pthread_mutexattr_setprotocol(3C)可用来设置互斥锁属性对象的协议属性。

pthread_mutexattr_setprotocol语法

#include<pthread.h>int pthread_mutexattr_setprotocol(pthread_mutexattr_t*attr, int protocol);attr指示以前调用pthread_mutexattr_init()时创建的互斥锁属性对象。

protocol可定义应用于互斥锁属性对象的协议。

pthread.h中定义的 protocol可以是以下值之一:PTHREAD_PRIO_NONE、PTHREAD_PRIO_INHERIT或 PTHREAD_PRIO_PROTECT。

PTHREAD_PRIO_NONE

线程的优先级和调度不会受到互斥锁拥有权的影响。

PTHREAD_PRIO_INHERIT

此协议值(如 thrd1)会影响线程的优先级和调度。如果更高优先级的线程因 thrd1所拥有的一个或多个互斥锁而被阻塞,而这些互斥锁是用 PTHREAD_PRIO_INHERIT初始化的,则 thrd1将以高于它的优先级或者所有正在等待这些互斥锁(这些互斥锁是 thrd1指所拥有的互斥锁)的线程的最高优先级运行。

如果 thrd1因另一个线程(thrd3)拥有的互斥锁而被阻塞,则相同的优先级继承效应会以递归方式传播给 thrd3。

使用 PTHREAD_PRIO_INHERIT可以避免优先级倒置。低优先级的线程持有较高优先级线程所需的锁时,便会发生优先级倒置。只有在较低优先级的线程释放该锁之后,较高优先级的线程才能继续使用该锁。设置 PTHREAD_PRIO_INHERIT,以便按与预期的优先级相反的优先级处理每个线程。

如果为使用协议属性值 PTHREAD_PRIO_INHERIT初始化的互斥锁定义了 _POSIX_THREAD_PRIO_INHERIT,则互斥锁的属主失败时会执行以下操作。属主失败时的行为取决于pthread_mutexattr_setrobust_np()的 robustness参数的值。

解除锁定互斥锁。

互斥锁的下一个属主将获取该互斥锁,并返回错误 EOWNERDEAD。

互斥锁的下一个属主会尝试使该互斥锁所保护的状态一致。如果上一个属主失败,则状态可能会不一致。如果属主成功使状态保持一致,则可针对该互斥锁调用pthread_mutex_init()并解除锁定该互斥锁。

注–如果针对以前初始化的但尚未销毁的互斥锁调用pthread_mutex_init(),则该互斥锁不会重新初始化。

如果属主无法使状态保持一致,请勿调用pthread_mutex_init(),而是解除锁定该互斥锁。在这种情况下,所有等待的线程都将被唤醒。以后对pthread_mutex_lock()的所有调用将无法获取互斥锁,并将返回错误代码 ENOTRECOVERABLE。现在,通过调用pthread_mutex_destroy()来取消初始化该互斥锁,即可使其状态保持一致。调用pthread_mutex_init()可重新初始化互斥锁。

如果已获取该锁的线程失败并返回 EOWNERDEAD,则下一个属主将获取该锁及错误代码 EOWNERDEAD。

PTHREAD_PRIO_PROTECT

当线程拥有一个或多个使用 PTHREAD_PRIO_PROTECT初始化的互斥锁时,此协议值会影响其他线程(如 thrd2)的优先级和调度。thrd2以其较高的优先级或者以 thrd2拥有的所有互斥锁的最高优先级上限运行。基于被 thrd2拥有的任一互斥锁阻塞的较高优先级线程对于 thrd2的调度没有任何影响。

如果某个线程调用sched_setparam()来更改初始优先级,则调度程序不会采用新优先级将该线程移到调度队列末尾。

线程拥有使用 PTHREAD_PRIO_INHERIT或 PTHREAD_PRIO_PROTECT初始化的互斥锁

线程解除锁定使用 PTHREAD_PRIO_INHERIT或 PTHREAD_PRIO_PROTECT初始化的互斥锁

一个线程可以同时拥有多个混合使用 PTHREAD_PRIO_INHERIT和 PTHREAD_PRIO_PROTECT初始化的互斥锁。在这种情况下,该线程将以通过其中任一协议获取的最高优先级执行。

pthread_mutexattr_setprotocol返回值

如果成功完成,pthread_mutexattr_setprotocol()会返回 0。其他任何返回值都表示出现了错误。

如果出现以下任一情况,pthread_mutexattr_setprotocol()将失败并返回对应的值。

ENOSYS

描述:选项 _POSIX_THREAD_PRIO_INHERIT和 _POSIX_THREAD_PRIO_PROTECT均未定义并且该实现不支持此函数。

ENOTSUP

描述:protocol指定的值不受支持。

如果出现以下任一情况,pthread_mutexattr_setprotocol()可能会失败并返回对应的值。

EINVAL

描述:attr或 protocol指定的值无效。

EPERM

描述:调用方无权执行该操作。

文章版权声明:除非注明,否则均为本荣数码网原创文章,转载或复制请以超链接形式并注明出处。