我正在为我的一个实时 C 库实现 Python 绑定。我读过 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
)我可以检索互斥锁,没问题。但是,可以发送给函数的东西的类型似乎是字符串、数字和对象。前两个显然不能代替 a 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
和"?"
应该是什么。