我有一個非常耗費資源的代碼,所以我可以將工作負載分割爲多個pthread。儘管一切正常,但計算速度更快等。我猜測發生的情況是該處理器內核上的其他進程變得非常緩慢,以至於在運行幾秒後它們會崩潰。資源密集型多線程查殺其他進程
我已經設法殺掉Chrome選項卡,Cinnamon DE甚至整個OS(內核?)等隨機進程。
代碼:(它很晚了,我太累了,不能做一個僞代碼,甚至評論..) - 但它是一個暴力破解代碼,而不是破解,但測試密碼和或CPU IPS。
任何想法如何解決這個問題,同時仍然保持儘可能多的性能?
static unsigned int NTHREADS = std::thread::hardware_concurrency();
static int THREAD_COMPLETE = -1;
static std::string PASSWORD = "";
static std::string CHARS;
static std::mutex MUTEX;
void *find_seq(void *arg_0)
{
unsigned int _arg_0 = *((unsigned int *) arg_0);
std::string *str_CURRENT = new std::string(" ");
while (true)
{
for (unsigned int loop_0 = _arg_0; loop_0 < CHARS.length() - 1; loop_0 += NTHREADS)
{
str_CURRENT->back() = CHARS[loop_0];
if (*str_CURRENT == PASSWORD)
{
THREAD_COMPLETE = _arg_0;
return (void *) str_CURRENT;
}
}
str_CURRENT->back() = CHARS.back();
for (int loop_1 = (str_CURRENT->length() - 1); loop_1 >= 0; loop_1--)
{
if (str_CURRENT->at(loop_1) == CHARS.back())
{
if (loop_1 == 0)
str_CURRENT->assign(str_CURRENT->length() + 1, CHARS.front());
else
{
str_CURRENT->at(loop_1) = CHARS.front();
str_CURRENT->at(loop_1 - 1) = CHARS[CHARS.find(str_CURRENT->at(loop_1 - 1)) + 1];
}
}
}
};
}
您所描述的症狀是那些內存不足的情況引起的內存或資源泄漏,調用[OOM殺手(https://開頭WWW .memset.com/docs/additional-information/oom-killer /) – kfsone
@kfsone聽起來很可能,但應用程序最多使用20MB,而Valgrind報告如下:可能丟失:14個塊中的2,223字節&&仍然可達:56字節在7個街區。當然,我會嘗試解決一些泄漏問題,但有時Valgrind會提供無害的數據。 – areuz
一個耗費CPU的進程不應該會導致其他進程崩潰。它會降低速度,但由於硬件故障或內核錯誤,只能使它們崩潰。 –