私は自分のリアルタイム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
)解析することで、ミューテックスを取得できます。問題ありません。ただし、関数に送信できるもののタイプは、文字列、数値、およびオブジェクトのようです。最初の2つは明らかにを置き換えることはできません。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
にはわからないところ。"?"