使用100%的CPU

3

我需要一个函数,可以让我的CPU占用率达到100%。我有一颗单核心的CPU,有什么建议吗?

这个线程需要设置高优先级吗?


3
下投票和关闭原因请... - opc0de
1
不是我干的,但我也曾经想过这么做...只有在看完第一个答案后,我才明白问题的要点。听起来好像你想要通过智取操作系统来窃取其他人的CPU周期... - user180326
请注意,您所建议的可能会减缓相同优先级的线程,不会影响更高优先级的线程,并且会瘫痪较低优先级的线程 - 它们只能通过操作系统的反饥饿算法获得CPU,该算法每30秒仅提供临时优先级提升。在单CPU计算机上将一个CPU循环线程提升到非常高的优先级可能会导致需要进行“电源开关”重置。 - Martin James
2个回答

7

一个(无限)循环通常可以胜任:

while true do begin

end;

显然,强制CPU在不执行任何有用操作的情况下达到100%的使用率只应该用于学术目的,并且只能在自己的硬件上进行,绝不能在任何你打算发布的真实应用程序中使用。


1
另外,如果您希望在此过程中拥有活动GUI,则需要在单独的线程(非GUI,即后台工作线程)中生成此线程。另外,如果您有多个CPU /核心或超线程,则需要与虚拟CPU数量相同的线程。 - Vilx-
圣诞快乐,Darin。当然要放一天假了! :-) - David Heffernan
我经常无意中使用这个while循环... - lkessler
2
@DavidHeffernan - 你还在这里干嘛?是卡姆布里亚的酒吧都关门了,还是你昨晚喝得太多被禁止入内/宿醉了... :) - Martin James

5
例如,通过下一个线程:
unit Unit2;

interface

uses
  Classes;

type
  TLoadThread = class(TThread)
  public
    class var Stop: Boolean;
  protected
    procedure Execute; override;
  public
    constructor Create;
  end;

implementation

constructor TLoadThread.Create;
begin
  inherited Create;
  FreeOnTerminate:= True;
end;

procedure TLoadThread.Execute;
begin
  repeat until Stop;
end;

end.

一个使用示例:

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure LoadCPU;
begin
  TLoadThread.Stop:= False;
  TLoadThread.Create;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  LoadCPU;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  TLoadThread.Stop:= True;
end;

如果你的CPU有N个核心,请点击按钮1 N次以达到100%的CPU负载;无需增加线程优先级。


在未终止的情况下更容易执行。 - David Heffernan
1
要调用终止函数,您需要保留对象引用,这在这里是不方便的。 - kludg
没注意到 FreeOnTerminate。我自己从不使用它。不喜欢放弃控制。 - David Heffernan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接