読者です 読者をやめる 読者になる 読者になる

ふと思いついたので特定コアに処理を割り当ててみた

C++

スレッド(C#の場合はデリゲート)を使うと、「プログラムは上から順番に実行される」原則が覆され、う ち ゅ う の ほ う そ く が み だ れ る!
と思ってしまう。それが初心者クオリティ。

参考:

やってみた。以下サンプル。

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <sched.h>
#include <pthread.h>

using namespace std;

pthread_mutex_t mutex;


int set_cpu_id(int cpu_id)
{
	cpu_set_t mask;
	__CPU_ZERO(&mask);
	__CPU_SET(cpu_id, &mask);
	
	if (sched_setaffinity(0, sizeof(mask), &mask) == -1) {
		std::cout << "Failed to set CPU affinity. " << endl;
	}
	else 
		std::cout << "Succeed to set CPU " << cpu_id << "affinity. " << endl;
	
	return 0;
}

uint32_t waste_time(uint32_t n){
	uint32_t i = 0;
	while (i < n*200000) {
		i++;
	}
	
	return i;
}

void* thread_main(void* pData){
	int* cpuID = (int*)pData;
	set_cpu_id(*cpuID);
	uint32_t num = waste_time((uint32_t)cpuID);
	
	std::cout << "count " << num << endl;
	pthread_exit(NULL);
}

int main(){
	pthread_t tid1, tid2;
	int num1 = 5, num2 = 6;
	int* cpuID1 = &num1;
	int* cpuID2 = &num2;
	
	pthread_mutex_init(&mutex, NULL);
	
	pthread_create(&tid1, NULL, thread_main, cpuID1);
	pthread_create(&tid2, NULL, thread_main, cpuID2);
	
	pthread_join(tid1, NULL);
	pthread_join(tid2, NULL);
	
	pthread_mutex_destroy(&mutex);
	
	return 0;
}