std :: thread с pthread_setschedparam с c ++ 11 - PullRequest
0 голосов
/ 29 июня 2018

Я хотел установить приоритет разработанного пользовательского пула потоков. поэтому я обнаружил, что для установки приоритета нужно использовать метод pthred pthread_setschedparam. Поскольку pthread_t и native_handle_type отличаются, я сделал что-то вроде этого -

void SetPriority(int id, int priority, int policy) {
            bool ret = true;
            sched_param sch_params;
            sch_params.sched_priority = 20;
            pthread_t p;
            p.p = threads_[id].native_handle();
            if (pthread_setschedparam(p, SCHED_FIFO, &sch_params)) {
                std::cerr << "Failed to set Thread scheduling : " << std::strerror(errno) << std::endl;
            }

        }

Я получаю нарушение прав доступа для pthreadVC2.dll.

Чтобы проверить, что у меня правильная версия Windows, я сделал некоторый тест, подобный этому -

int main(){
pthread_t thread1, thread2;
    int thr = 1;
    int thr2 = 2;
    // start the threads
    pthread_create(&thread1, NULL, *threadfn, (void *)thr);
    pthread_create(&thread2, NULL, *threadfn, (void *)thr2);

    sched_param sch_params;
    sch_params.sched_priority = 20;

    if (pthread_setschedparam(thread1, SCHED_FIFO, &sch_params)) {
        std::cerr << "Failed to set Thread scheduling : " << std::strerror(errno) << std::endl;
    }

    // wait for threads to finish
    int po1, po2; 
    sched_param sched_param1, sched_param2;
    pthread_getschedparam(thread1,&po1,&sched_param1);
    pthread_getschedparam(thread2, &po2, &sched_param2);
    cout << "thread 1:policy - " << po1 << " priority - " << sched_param1.sched_priority << endl;
    cout << "thread 2:policy - " << po2 << " priority - " << sched_param2.sched_priority << endl;

    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);
    return 0;
}

Я обнаружил, что ошибка № 1 (приоритет не установлен). И оба потока, имеющие политику 0 и приоритет 0

Как правильно установить приоритет pthread и как я могу использовать эту функцию из std :: thread?

Редактировать: Настройка среды Windows: Использование Visual Studio 2015 с Windows 10. Загруженный pthread (pthreads-w32-2-9-1-release.zip) с ftp: //sourceware.org/pub/pthreads-win32/. настройка проекта - включены дополнительные каталоги включения Linker> General и задайте расположение библиотеки pthread Дополнительные зависимости: pthreadVC2.lib и pthreadVCE2.lib и скопировал pthreadVC2.dll в каталог проекта.

1 Ответ

0 голосов
/ 09 августа 2019

Вот пример программы, которая показывает, как использовать pthread_getschedparam и pthread_setschedparam с std :: thread, взятой из здесь .

#include <thread>
#include <mutex>
#include <iostream>
#include <chrono>
#include <cstring>
#include <pthread.h>

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;
    if (pthread_setschedparam(t1.native_handle(), SCHED_FIFO, &sch)) {
        std::cout << "Failed to setschedparam: " << std::strerror(errno) << '\n';
    }

    t1.join(); t2.join();
}
...