1

可以通过从类继承并从底层属性公开数据来创建属性countthreading._RLock._count这很容易通过示例来证明:

import threading


# noinspection PyProtectedMember
class RLock(threading._RLock):
    """RLock() -> RLock instance with count property"""

    @property
    def count(self):
        """Count property showing current level of lock ownership."""
        return self._count
  1. _thread.RLock是否可以通过获取计数来做同样的事情ctypes
  2. 如果可能,该代码是否比上面显示的版本有任何优势?
  3. 如果有利的话,必须编写什么代码才能访问计数?
4

1 回答 1

2

是否可以通过 ctypes 获取计数来对 _thread.RLock 执行相同的操作?

是的,这是可能的,因为给出了严格的rlockobject定义

import ctypes, _thread

class RLock(_thread.RLock):

    offsetof_rlock_count = 32 # on 64-bit system

    @property
    def count(self):
        rlock_count_b = ctypes.string_at(id(self)+self.offsetof_rlock_count, 8)
        return int.from_bytes(rlock_count_b, 'little', signed=False)

rlock = RLock()
with rlock:
    with rlock:
        print(rlock.count)

产量:

2

或更正式的版本:

class S_rlockobject(ctypes.Structure):

    _fields_ = [
        ('ob_refcnt', ctypes.c_ssize_t),
        ('ob_type', ctypes.c_void_p),
        ('rlock_lock', ctypes.c_void_p),
        ('rlock_owner', ctypes.c_long),
        ('rlock_count', ctypes.c_ulong),
        ('in_weakreflist', ctypes.c_void_p),
    ]

class RLock(_thread.RLock):

    def __init__(self):
        super().__init__()
        self._s = S_rlockobject.from_address(id(self))

    @property
    def count(self):
        return self._s.rlock_count

如果可能,该代码是否比上面显示的版本有任何优势?如果有利的话,必须编写什么代码才能访问计数?

两种方法都使用了非公开的API,很难说哪个更好,但我觉得继承纯pythonRLock实现更简单。性能差异在这里可以忽略不计。

于 2017-11-28T18:27:30.283 回答