Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 资源密集型多线程杀死其他进程_C++_Linux_Multithreading_Pthreads_Brute Force - Fatal编程技术网

C++ 资源密集型多线程杀死其他进程

C++ 资源密集型多线程杀死其他进程,c++,linux,multithreading,pthreads,brute-force,C++,Linux,Multithreading,Pthreads,Brute Force,我有一个非常资源密集型的代码,我制作的,所以我可以在多个pthread上分割工作负载。虽然一切正常,但计算速度更快,等等。我猜处理器核心上的其他进程会变得非常慢,以至于在运行几秒钟后崩溃 我已经成功地杀死了随机进程,比如Chrome标签、肉桂DE甚至整个操作系统(内核?) 代码:(已经很晚了,我太累了,无法编写伪代码,甚至无法进行注释……) --但这是一个暴力代码,不是用来破解,而是用来测试密码或CPU IP 有没有办法在保持尽可能高的性能的同时解决这个问题 static unsigned in

我有一个非常资源密集型的代码,我制作的,所以我可以在多个pthread上分割工作负载。虽然一切正常,但计算速度更快,等等。我猜处理器核心上的其他进程会变得非常慢,以至于在运行几秒钟后崩溃

我已经成功地杀死了随机进程,比如Chrome标签、肉桂DE甚至整个操作系统(内核?)

代码:(已经很晚了,我太累了,无法编写伪代码,甚至无法进行注释……) --但这是一个暴力代码,不是用来破解,而是用来测试密码或CPU IP

有没有办法在保持尽可能高的性能的同时解决这个问题

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];
        }
      }
    }
  };
}
static unsigned int NTHREADS=std::thread::hardware_concurrency();
静态int线程_COMPLETE=-1;
静态std::string PASSWORD=“”;
静态std::字符串字符;
静态std::互斥互斥;
void*find_seq(void*arg_0)
{
无符号整数arg0=*((无符号整数*)arg0);
std::string*str_CURRENT=新std::string(“”);
while(true)
{
for(unsigned int loop\u 0=\u arg\u 0;loop\u 0back()=CHARS[loop_0];
如果(*str_CURRENT==密码)
{
线程\u COMPLETE=\u arg\u 0;
返回(void*)str_当前值;
}
}
str_CURRENT->back()=CHARS.back();
对于(int loop\u 1=(str\u CURRENT->length()-1);loop\u 1>=0;loop\u 1--)
{
如果(str_CURRENT->at(loop_1)=CHARS.back())
{
if(循环_1==0)
str_CURRENT->assign(str_CURRENT->length()+1,CHARS.front());
其他的
{
str_CURRENT->at(loop_1)=CHARS.front();
str_CURRENT->at(loop_1-1)=CHARS[CHARS.find(str_CURRENT->at(loop_1-1))+1];
}
}
}
};
}
Areuz

你能发布完整的代码吗?我怀疑问题在于NTHREADS值。在我的Ubuntu框中,该值设置为8,即/proc/cpuinfo文件中的内核数。在我的机器上启动8个“热”线程占用了100%的CPU。内核将为其自己的关键进程划分时间片,但通常所有其他进程都会缺少CPU

检查/etc/cpuinfo中的最大处理器值,并至少比该值低一个。CPU在我的机箱上编号为0-7,因此7是我的最大值。实际最大值可能是3,因为我的4个核心是超线程。对于完全CPU化的进程,超线程通常没有帮助

总之,不要占用所有的CPU,这会使系统不稳定


--Matt

感谢您的回答,特别是Matthew Fisher建议在其他系统上试用


经过一些尝试和错误,我决定收回我认为是稳定的CPU超频(我有一年多了),这解决了这个奇怪的行为。我想我从来没有运行过这样一个CPU密集且(我猜)高效(关于不通过屈服来限制整个CPU)的脚本来看到这种情况

正如Matthew所建议的那样,我需要想出一个更好的方法,而不仅仅是不断地使用
while true
循环检查THREAD_COMPLETE变量,但我希望在注释中解决这个问题


这里有供未来访问者使用的完整和更新的代码:

您描述的症状是由内存或资源泄漏导致的内存不足情况,调用@kfsone听起来很可能,但应用程序最多使用20MB,Valgrind报告如下:可能丢失:14个块中2223字节&&仍然可访问:7个块中56字节。当然,我会尝试修复一些漏洞,但有时Valgrind会给出不准确的数据。占用CPU的进程应该永远无法使其他进程崩溃。它会减慢它们的速度,但只会因为硬件故障或内核错误而使它们崩溃。@JonathanWakely我已经在下面发布了我对这个问题的答案。我必须等到我接受它。我有一个i7 3770K@4.8GHz。它有8个线程。显然,我试图使用所有线程来提高性能。我只是想知道为什么像“stress”命令这样的命令可以使用所有的CPU而不会导致任何崩溃。另外,即使我只使用几个线程,在这些线程上运行的进程,正如我所说的,我的一些Chrome标签等,大部分时间都会随着时间的推移崩溃。完整的代码,只是为了更好的衡量:我决定看看“压力”源代码,现在我更困惑了。我可以用它整天给整个cpu施加压力,所以我希望有一些复杂的代码,休眠一段时间,或者降低优先级。但是使用该命令对cpu施加压力的文字代码是:
hogcpu(void){while(1)sqrt(rand());return 0;}
Hmm,没有乐趣。我在本地运行代码,没有问题。它使我的8个内核达到了最大值,但这个盒子仍然工作正常。我跑了大约20分钟,没有任何问题。Ubuntu 14.04。你能试试另一个盒子吗?AWS有免费帐户。作为一个次要的注意事项,main中的while循环正在使用另一个内核运行。pthread_join可用于监视线程是否退出。THREAD_COMPLETE可用作线程退出的标志,而不是(1)线程尚未完成时,THREAD_COMPLETE将用作线程退出的标志。此外,我还有工作负载分布,因此只有1个线程将返回结果。我必须使用
pthread\u tryjoin\u np
来检查所有线程,看看哪个线程完成了,但我希望我的代码能够跨操作系统移植。正如您在
\u np
中看到的,该命令是不可移植的。事实上,在运行同一发行版的另一台计算机上,我无法重新创建此行为。我将在明天进一步研究,但是
pthread\u tryjoin\u np
的问题仍然存在。。。