現在、複数の画像を一度に読み込んで変換するパイプラインに取り組んでいます。これは同時に多くの画像 (1440) で発生しているため、メモリ フットプリントが非常に大きくなります。そのため、setrlimit に基づいてメモリ管理システムを実装しようとしましたが、生成されたスレッド (std::thread) は喜んで制限を無視するため、影響はないようです。スレッド化された関数 - 最終的にプログラムが強制終了されます。制限を設定するために使用するコードは次のとおりです。
void setMemoryLimit(std::uint64_t bytes)
{
struct rlimit limit;
getrlimit(RLIMIT_AS, &limit);
if(bytes <= limit.rlim_max)
{
limit.rlim_cur = bytes;
std::cout << "New memory limit: " << limit.rlim_cur << " bytes" << std::endl;
}
else
{
limit.rlim_cur = limit.rlim_max;
std::cout << "WARNING: Memory limit couldn't be set to " << bytes << " bytes" << std::endl;
std::cout << "New memory limit: " << limit.rlim_cur << " bytes" << std::endl;
}
if(setrlimit(RLIMIT_AS, &limit) != 0)
std::perror("WARNING: memory limit couldn't be set:");
// included for debugging purposes
struct rlimit tmp;
getrlimit(RLIMIT_AS, &tmp);
std::cout << "Tmp limit: " << tmp.rlim_cur << " bytes" << std::endl; // prints the correct limit
}
私はLinuxを使用しています。man ページには、 setrlimit がプロセス全体に影響を与えると記載されているため、スレッドが影響を受けないように見える理由がわかりません。
編集:ちなみに、上記の関数は main() の最初で呼び出されます。