9

256Mb システム上の Linux で多くの Pthreads を作成する C で何かをプログラミングしています。私は通常+200Mbの空き容量があります。

少量のスレッドでプログラムを実行すると動作しますが、約 100 のスレッドを作成すると、システムのメモリが不足するためにエラーが発生します。私はいくつかのテストを行い、各スレッドはほぼ 2Mb を使用しました。スレッドのスタック サイズは 16Kb に設定されています。

各スレッドの作成に使用するコード:

pthread_attr_t attr;
pthread_attr_init(&attr);
size_t stacksize;
stacksize = (double) 16*1024;
int res = pthread_attr_setstacksize (&attr, stacksize);
int res2 = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
if (res != 0 || res2 != 0) {
    logs << "pthread_attr_XX: error "+int2string(res);
    exit(-1);
}
pthread_t id;
pthread_create(&id, &attr, &Class::thread_callback, &some_var);

それは正常ですか、それとも何か不足していますか?ありがとう。

4

6 に答える 6

4

役に立つかどうかはわかりませんが、最初のスレッドを作成する前に、スタック サイズを 16k に制限するためにsetrlimitwithを呼び出してみてください。RLIMIT_STACK

于 2011-08-30T06:28:55.957 に答える
2

システム スレッド ライブラリは、メモリが非常に限られているシステムで多数のスレッドをサポートするようには設計されていません。その目的のために設計されたスレッド ライブラリを使用するか、使用するスレッド数を減らす必要があります。

于 2011-08-30T13:27:15.760 に答える
1

ええ、ほとんどすべてのオペレーティング システムが、多くのスレッドで停止して停止することはよくあることです。OS メーカー (Linux など) がそれほど多くの CPU を搭載しているシステムはほとんどないため、これは問題ではありません。そのため、100 スレッドでは 8 スレッドよりもはるかに高速にコードを実行できない可能性があります (または、CPU の数にかかわらず)持ってる)。

あなたがする必要があるのは、ある種のスレッドプーリングだと思います。また、このページの ulimit の回答は、本当に多くのスレッドが必要な場合に役立つと思いますが、私が言ったように、ほとんどの状況で多くのスレッドが得られるとは思いません。システム、それはそれをよりポータブルにします。

于 2011-08-30T00:41:12.933 に答える
0

より低いオーバーヘッドが必要な場合は、ファイバーなどのユーザー空間のスレッド化テクノロジ、および協調的なタスク管理を検討してください。

http://en.wikipedia.org/wiki/Fiber_(コンピュータ科学)

http://www.evanjones.ca/software/threading.html

GNU ポータブル スレッド:

http://www.gnu.org/software/pth/

Boost C++ コルーチン:

http://www.boost.org/doc/libs/1_60_0/libs/coroutine/doc/html/index.html

参考までに、Windows 専用ファイバー:

http://msdn.microsoft.com/en-us/library/ms682661(v=vs.85).aspx

その他の実装例については、ウィキペディアのリンクを参照してください。

于 2011-08-30T04:30:57.933 に答える
-2

これが理由かもしれません:

"(漏れを認識

結合可能なスレッドを作成したが、そのスレッドに結合するのを忘れた場合、そのリソースまたはプライベート メモリは常にプロセス空間に保持され、再利用されることはありません。結合可能なスレッドを常に結合します。それらに参加しないと、重大なメモリ リークが発生する危険があります。)"

ここで読んでください: http://www.ibm.com/developerworks/library/l-memory-leaks/

于 2015-04-03T10:00:24.090 に答える