2010-12-05 8 views
6

これは危険なビジネスです。私は、グローバルインタープリタロックが並列性の猛烈な敵であると理解しています。しかし、NumPy's C API(具体的にはNumPy配列のPyArray_DATAマクロ)を使用している場合、複数の同時スレッドから呼び出すと潜在的な影響はありますか?NumPyのC API関数を複数のスレッドから呼び出すことの意義は何ですか?

私はまだGILを所有し、NumPy's threading supportで公開しないことに注意してください。また、NumPyがスレッドの安全性を保証していないにもかかわらず、実際にはPyArray_DATAがスレッドセーフなものであっても、私にとってはで十分です。です。

私はLinux上でNumPy 1.3.0でPython 2.6.6を実行しています。

答えて

6

NumPy 1.3.0のソースコードを掘り下げた後、答えはです。はい、PyArray_DATAはスレッドセーフです。

  1. PyArray_DATA ndarrayobject.hに定義されている:

    #define PyArray_DATA(obj) ((void *)(((PyArrayObject *)(obj))->data)) 
    
  2. PyArrayObject構造体のタイプは、同じファイル内で定義され あります。興味のある分野 は次のとおりです。

    char *data; 
    

    はだから今、質問が複数のスレッドからdataへのアクセスは安全であるかどうかです。

  3. 新しいNumPy配列を最初から作成する(つまり、既存のデータ構造から派生させない)ために、NULLデータポインタをarrayobject.cに定義されたPyArray_NewFromDescrに渡します。

  4. これにより、dataフィールドにメモリを割り当てるためにPyArray_NewFromDescrPyDataMem_NEWを呼び出すようになります。要約すると

    #define PyDataMem_NEW(size) ((char *)malloc(size)) 
    

PyArray_DATAは、スレッドセーフであるとnumpyのアレイを別々に作成されている限り、異なるスレッドからそれらへの書き込みをしても安全である:これは単にmallocのためのマクロです。

関連する問題