0

Go言語についてはかなり読んだことがあります。気に入らなかったことがたくさんあります。日常生活で使いたくないほどです。しかし、私が本当に好きな言語については、ゴルーチンが1つあります。

私はそれをCで実装する方法を考えていました。これまでのところ、インターネットで見つけることができる最高のものは

#define go if (!fork()) for(;;exit(0))

そうすれば、関数呼び出しの前にgoを付けることができます。

go printf("Hello, world!\n");

別のスレッドで実行され、次のようになります。

go { printf("Hello, world!\n"); foo(); bar(); baz(); }

しかし、もちろん、fork()には速度の問題があります。(私のボックスでは、fork()はprintf()の7倍の時間がかかり、rdtsc x86命令を使用してベンチマークされ、コア間の切り替えやスケジュールの可能性を排除するために数回実行されます。)

だから、私の質問は、これをより速く実装するためのより良い方法はありますか?

4

2 に答える 2

1

Goroutinesは、ほとんどの場合スレッドのファンシーな言葉であり、スレッド間通信などのためのいくつかの追加機能があります。

あなたが興味を持っているのは、コードのセクションを別のスレッドで簡潔に実行する機能だと思います。残念ながら、Cでこれを行う簡単な方法はありません。バックグラウンドで実行するコードを囲む関数を記述し、その関数を受け入れて必要な魔法を実行したマクロまたは関数を使用する必要があります。pthread_create()または類似。

誰かがマクロを使用して関数をオンザフライで作成する賢い方法を考え出さない限り?誰?

最も基本的なスレッド化されたアプリケーションを除くすべてのアプリケーションで、ある種の同期が必要になることに注意してください。これにより、作業がはるかに簡単になります。

于 2012-04-17T01:13:34.363 に答える
1

OpenMPを見てください。#pragmaこれにより、比較的単純なディレクティブを使用して、コード ブロックとループの反復に対してスレッドを生成できます。これは 10 年以上前から存在しており、既に多くのコンパイラ (を含むgcc) で利用できます。

スレッドで作業を開始するのは よりも高速ですfork()が、多くのスレッドを管理しない単純なアプリケーションでは、バックグラウンドでスレッド プールの初期化オーバーヘッドが発生するため、パフォーマンスの向上がわかりにくくなる場合があります。

于 2012-04-17T01:54:17.123 に答える