pthread_setschedparam 无法在带有 mingw64 的 GCC 上工作

问题描述 投票:0回答:1

我尝试在安装了 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”所建议的那样。

c++ multithreading gcc pthreads mingw-w64
1个回答
0
投票

我正在根据 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();
}
© www.soinside.com 2019 - 2024. All rights reserved.