Как использовать pthread_setaffinity_np с QueryPerformanceCounter? - PullRequest
0 голосов
/ 23 апреля 2020

Мне нужно посчитать время в микросекундах, используя поток, и я хочу связать этот поток, чтобы получить точное значение счетчика. Я пытаюсь использовать функцию pthread_setaffinity_np с QueryPerformanceCounter. Мой код ниже;

#include <iostream>
#include <windows.h>
#include <pthread.h>
#include <semaphore.h>
using namespace std;

int exitKey = 0;
double timex;
sem_t my_semaphore;

double PCFreq = 0.0;
__int64 CounterStart = 0;

void StartCounter()
{
    cpu_set_t mask1;
    CPU_ZERO(&mask1);
    CPU_SET(1,&mask1);
    pthread_setaffinity_np(pthread_self(),sizeof(mask1),&mask1);

    LARGE_INTEGER li;
    if(!QueryPerformanceFrequency(&li))
    cout << "QueryPerformanceFrequency failed!\n";

    PCFreq = double(li.QuadPart)/1000000.0;

    QueryPerformanceCounter(&li);
    CounterStart = li.QuadPart;
}

double GetCounter(){
    LARGE_INTEGER li;
    QueryPerformanceCounter(&li);
    return double(li.QuadPart-CounterStart)/PCFreq;
}

void* WaitThrd(void *param){
    while(exitKey!=9){
        Sleep(1000);
        sem_post(&my_semaphore);
    }
    return NULL;
}

void* PrintCounter(void *param){

    while(exitKey != 9){
        sem_wait(&my_semaphore);
        timex = GetCounter();
        cout << timex << endl;
    }
    return NULL;
}

int main()
{
    pthread_t t1, t2;
    StartCounter();

    sem_init(&my_semaphore, 0, 0);
    pthread_create(&t1, NULL, WaitThrd, NULL);
    pthread_create(&t2, NULL, PrintCounter, NULL);

    while(exitKey!=9){
        cout << "Enter 9 to exit" << endl;
        cin>> exitKey;
    }

    sem_destroy(&my_semaphore);
    pthread_exit(NULL);
    return 0;
}

Кажется, все в порядке. Однако я не уверен, что это правда. У меня есть несколько вопросов по этому поводу.

  1. Как мне проверить, связана ли моя функция StartCounter с этим ядром или нет?
  2. Я не уверен, где я использую pthread_setaffinity_np и вызываю функцию StartCounter в main. Это правда?
  3. Я использую пока l oop для непрерывной работы. Это плохо l oop для производительности? что я могу использовать вместо L oop? Не могли бы вы помочь мне об этих вопросах? Спасибо!
...