- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在致力于为我的实时 C 库实现 Python 绑定(bind)。我读过,Python 中的线程不是实际的线程,并且它们并不真正并行运行(因为全局解释器锁)。不过,我必须考虑以下情况。
想象一下以下 C 函数:
int stoppable_lock(mutex *m, bool *stop)
{
while (!stop || !*stop)
if (timed_lock(m, SOME_TIME) == SUCCESS)
return SUCCESS;
return DIDNT_LOCK;
}
该函数等待互斥体,但可以通过使用stop
取消。在最简单的情况下,能够优雅地停止使用它的线程,无论互斥锁的其他用户发生什么情况(例如,如果他们在持有锁时死亡)。
我的问题是弄清楚如何为此函数编写 Python 包装器。通过解析参数(使用PyArg_ParseTuple
),我可以检索互斥体,没有问题。然而,可以发送到函数seem to be的东西类型字符串、数字和对象。前两个显然不能替代 bool *
,而且我怀疑为 bool *
编写包装器是一个好主意。
我的问题是,如何获取一个参数,该参数是对变量(与其他 python 线程共享)的引用,而不仅仅是它的副本?
这是我缺少的函数(对于像 mutex.stoppable_lock(stop)
这样的用法):
static PyObject *_stoppable_lock(_mutex *obj, PyObject *args)
{
int ret;
BOOL_STAR stop;
if (!PyArg_ParseTuple(args, "?", &stop))
{
PyErr_SetString(PyExc_ValueError, "Usage: mutex.stoppable_lock(BOOL_STAR)");
return NULL;
}
ret = stoppable_lock(obj->orig, stop);
if (_set_exception(ret))
return NULL;
Py_RETURN_NONE;
}
我不知道 BOOL_STAR
和 "?"
应该是什么。
最佳答案
您需要为 bool
创建一个包装类型,并使用用于嵌入值的 Python 变异函数。如果您想避免创建自己的类型,并且您相信 C _Bool 与 C++ bool 相同,那么您可以使用 ctypes.c_bool 。 Python 脚本可以执行以下操作
stop = ctypes.c_bool(False)
stoppable_lock(mutex, ctypes.addressof(stop))
然后另一个线程可以执行stop.value = True
。扩展模块需要一个 long,然后将其转换为指针。如果您希望类型更加安全,则需要为 bool 创建自己的包装类型。
关于python - 线程化Python和C绑定(bind)同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14607316/
我是一名优秀的程序员,十分优秀!