Мне нужно посчитать время в микросекундах, используя поток, и я хочу связать этот поток, чтобы получить точное значение счетчика. Я пытаюсь использовать функцию 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;
}
Кажется, все в порядке. Однако я не уверен, что это правда. У меня есть несколько вопросов по этому поводу.
- Как мне проверить, связана ли моя функция StartCounter с этим ядром или нет?
- Я не уверен, где я использую pthread_setaffinity_np и вызываю функцию StartCounter в main. Это правда?
- Я использую пока l oop для непрерывной работы. Это плохо l oop для производительности? что я могу использовать вместо L oop? Не могли бы вы помочь мне об этих вопросах? Спасибо!