2

threading.EventPythonの[1]の機能をCで実装するためのソリューションのリストを作成しようとしています。

通常、スレッド間の同期が必要な場合、使用/説明される最初のメカニズムはロック(別名ミューテックス)です。Pythonのthreading.Eventクラスは、特定の条件が真になるまでスレッドをアトミ​​ックにブロックするために使用できる同期のもう1つのメカニズムです。

これpthreadは、条件変数属性[2]を使用してこれを行うことが可能だと思います。

どうですかomp、これは可能ですか?Pythonで何が起こるかに基づいて、架空のタイプEventEventsQueue:を使用して次の例を作成しました。

int nthreads;
Event *evt;
EventsQueue *queue;

#pragma omp parallel private(evt)
{
    #pragma omp single
    {
        nthreads = omp_get_num_threads()-1;
    }
    if (!omp_get_thread_num()) /*master thread*/
    {
        while (nthreads)
        {
            evt = events_queue_pop(queue);
            evt_set(evt);
        }
    }
    else                       /*other threads */
    {
        evt = alloc_event();
        events_queue_append(queue, evt);
        /* each threads waits for master thread to set its event*/
        evt_wait(evt);
        free_event(evt);
        #pragma omp critical
        {
            nthreads--;
        }
    }
}

threading.Lockご覧のとおり、Pythonと同様の効果を得ることができます#pragma omp critical(例では、Pythonで保護nthreadsしています)。問題はthreading.Eventです。OpenMPではそのようなものは見つかりません。

[1] http://docs.python.org/2/library/threading.html#event-objects

[2] http://www.cs.cf.ac.uk/Dave/C/node31.html#SECTION003120000000000000000

4

1 に答える 1

0

注:この解決策は正しくありません。この回答の最後にある編集を見てください。

ええと...私はそれを行う方法を見つけたと思います。Pythonのスレッドモジュールのソース[1]を見ると、実際には単純に見えます。

それは、再入可能ロックのFIFOを維持することの問題です(OpenMPではとして実装されています)。aが呼び出されるたびに、新しいロックがFIFOに追加され、すぐに2回取得されます(2回目は、最初のロックが解放されるまでブロックされます!)。次に、が呼び出されると、FIFOのすべてのロックが解放され、 FIFOから削除されます。omp_nest_lock_tEvent.wait([timeout])Event.set()

この答えが、将来この問題を抱えている人に役立つことを願っています。

[1] http://svn.python.org/projects/python/branches/py3k/Lib/threading.py

編集:私はこの解決策が正しくないと言ってこの問題について話している記事を見つけました:

[2] http://www.michaelsuess.net/publications/wirz_suess_leopold_taskpools_06.pdf

于 2013-03-27T14:51:45.913 に答える