我尝试在安装了 GCC v13.2.0 的 Windows 11 上运行here的示例代码(MSYS2、UCRT 运行时):
#include <chrono>
#include <cstring>
#include <iostream>
#include <mutex>
#include <pthread.h>
#include <thread>
std::mutex iomutex;
void f(int num)
{
std::this_thread::sleep_for(std::chrono::seconds(1));
sched_param sch;
int policy;
pthread_getschedparam(pthread_self(), &policy, &sch);
std::lock_guard<std::mutex> lk(iomutex);
std::cout << "Thread " << num << " is executing at priority " << sch.sched_priority << '\n';
}
int main()
{
std::thread t1(f, 1), t2(f, 2);
sched_param sch;
int policy;
pthread_getschedparam(t1.native_handle(), &policy, &sch);
sch.sched_priority = 20;
int result = pthread_setschedparam(t1.native_handle(), SCHED_FIFO, &sch);
if (result)
std::cout << "Failed to setschedparam: " << std::strerror(result) << '\n';
t1.join();
t2.join();
}
代码编译通过,但输出是:
Failed to setschedparam: not supported
Thread 2 is executing at priority 0
Thread 1 is executing at priority 0
即使以管理员身份运行也会发生这种情况。将此与在 Ubuntu 上运行相同的代码进行对比,后者输出(仅当使用 sudo 时):
Thread 1 is executing at priority 20
Thread 2 is executing at priority 0
我使用了
g++ -v
并验证了 GCC 已配置为 --enable-threads=posix
并明确表示“线程模型:posix”。为什么这段代码不起作用?这是 winpthread 中的错误,还是即使使用 pthreads,在 Windows 上设置优先级的工作方式是否不同?
更新:我修改了上面的代码,根据
pthread_setschedparam
的返回值打印出错误,正如评论中“n. m. 可能是 AI”所建议的那样。
我正在根据 n 的评论回答我自己的问题。米。可能是人工智能。首先,mingw64 似乎只支持
SCHED_OTHER
的调度策略。其次,尽管在 Linux 上最大线程优先级为 99,但在 Windows 上为 15。这可以通过运行 sched_get_priority_max(policy)
来获得,它返回 15。(或者,如果我们包含 windows.h
,它将 THREAD_PRIORITY_TIME_CRITICAL
定义为 15 ,并且该宏可以直接与 pthread_setschedparam
使用。)这是代码的更正版本:
#include <chrono>
#include <cstring>
#include <iostream>
#include <mutex>
#include <pthread.h>
#include <thread>
std::mutex iomutex;
void f(int num)
{
std::this_thread::sleep_for(std::chrono::seconds(1));
sched_param sch;
int policy;
pthread_getschedparam(pthread_self(), &policy, &sch);
std::lock_guard<std::mutex> lk(iomutex);
std::cout << "Thread " << num << " is executing at priority " << sch.sched_priority << '\n';
}
int main()
{
std::thread t1(f, 1), t2(f, 2);
sched_param sch;
int policy;
pthread_getschedparam(t1.native_handle(), &policy, &sch);
int max_priority = sched_get_priority_max(policy);
std::cout << "The maximum thread priority on this system is: " << max_priority << '\n';
sch.sched_priority = max_priority;
int result = pthread_setschedparam(t1.native_handle(), SCHED_OTHER, &sch);
if (result)
std::cout << "Failed to setschedparam: " << std::strerror(result) << '\n';
t1.join();
t2.join();
}