2017-05-03 36 views
-2

私は割り当てのためのレート単調スケジューラーを構築しています。私はすべてのスレッドを同じプロセッサー上で実行する必要があります。私は何が間違っているのかは分かりませんが、私は同じエラーが発生し続けています(下の図を参照)。私は何をすべきかを試してみるために、たくさんのLinuxドキュメントを見てきましたが、私はできません。私は本当に助けに感謝します。前もって感謝します。'cpu_set_t'はC++型の名前ではありません

Error マイScheduler.cppファイル:この投稿へ返信しましたみんなへ

#define _GNU_SOURCE 
#include <iostream> 
#include <pthread.h> 
#include <unistd.h> 
#include <mutex> 
#include <condition_variable> 
#include <semaphore.h> 
#include <sched.h> 
#include <stdio.h> 
#include <assert.h> 
#include <stdlib.h> 

using namespace std; 

sem_t semaphore; 
sem_t mutex1; 
sem_t mutex2; 
sem_t mutex3; 
sem_t mutex4; 

// initialze variables 
int i = 0; 
int overrun1 = 0; 
int overrun2 = 0; 
int overrun3 = 0; 
int overrun4 = 0; 

int doWork(); 
void* p1(void *param); 
void* p2(void *param); 
void* p3(void *param); 
void* p4(void *param); 



int main(int argc, char const *argv[]) 
{ 
cpu_set_t cpus; 

CPU_ZERO(&cpus); 
CPU_SET(1, &cpus); 

sem_init(&mutex1, 0, 0); 
sem_init(&mutex2, 0, 0); 
sem_init(&mutex3, 0, 0); 
sem_init(&mutex4, 0, 0); 

// initialze all threads 
pthread_t thread1; 
pthread_t thread2; 
pthread_t thread3; 
pthread_t thread4; 

// actually create all threads 
pthread_create(&thread1, NULL, p1, NULL); 
pthread_create(&thread2, NULL, p2, NULL); 
pthread_create(&thread3, NULL, p3, NULL); 
pthread_create(&thread4, NULL, p4, NULL); 

while (i < 160) 
{ 
    if (i == 0) // initial case. at time 0 schedule all threads 
    { 
     sem_post(&mutex1); 
     sem_post(&mutex2); 
     sem_post(&mutex3); 
     sem_post(&mutex4); 
    } 

    else if (i % 16 == 0) // last case which happens every 16 units which schedules all threads again 
    { 
     sem_post(&mutex1); 
     sem_post(&mutex2); 
     sem_post(&mutex3); 
     sem_post(&mutex4); 
    } 

    else if (i % 4 == 0) // case that happens every 4 units of time 
    { 
     sem_post(&mutex1); 
     sem_post(&mutex2); 
     sem_post(&mutex3); 
    } 

    else if (i % 2 == 0) // case that happens every other unit of time 
    { 
     sem_post(&mutex1); 
     sem_post(&mutex2); 
    } 

    else if (i % 1 == 0) // case that happens every unit of time 
    { 
     sem_post(&mutex1); 
    } 
    i++; // increment i to go through the loop again 
} 

// join all threads back to the main one 
pthread_join(thread1, NULL); 
pthread_join(thread2, NULL); 
pthread_join(thread3, NULL); 
pthread_join(thread4, NULL); 

return 0; 
} 

// doWork function 

int doWork() 
{ 
int lousyArray[10][10]; 
int product = 1; 

for (int i = 0; i < 10; i++) 
{ 
    for (int j = 0; j < 10; j++) 
    { 
     lousyArray[i][j] = 1; 
    } 
} 
for (int k = 0; k < 1; k++) 
{ 
    for (int j = 0; j < 10; j++) 
    { 
     for (int i = 0; i < 10; i++) 
     { 
      product *= lousyArray[i][j]; 
     } 
    } 
} 
return 1; 
} 


void* p1(void *param) 
{ 
    bool thread1FinishFlag = false; 
    while(1) 
    { 
     sem_wait(&mutex1); 
     thread1FinishFlag = false; 
     for (int i = 0; i < 1; i++) 
     { 
      doWork(); 
     } 
     //increment counter here 
     thread1FinishFlag = true; 
    } 
} 
void* p2(void *param) 
{ 
    bool thread2FinishFlag = false; 
    while(1) 
    { 
     sem_wait(&mutex2); 
     thread2FinishFlag = false; 
     for (int i = 0; i < 2; i++) 
     { 
      doWork(); 
     } 
     //increment counter here 
     thread2FinishFlag = true; 
    } 
} 
void* p3(void *param) 
{ 
    bool thread3FinishFlag = false; 
    while(1) 
    { 
     sem_wait(&mutex3); 
     thread3FinishFlag = false; 
     for (int i = 0; i < 4; i++) 
     { 
      doWork(); 
     } 
     //increment counter here 
     thread3FinishFlag = true; 
    } 
} 
void* p4(void *param) 
{ 
    bool thread4FinishFlag = false; 
    while(1) 
    { 
     sem_wait(&mutex4); 
     thread4FinishFlag = false; 
     for (int i = 0; i < 16; i++) 
     { 
      doWork(); 
     } 
     //increment counter here 
     thread4FinishFlag = true; 
    } 
} 

void nsleep() 
{ 
    struct timespec delay; 

    delay.tv_sec = 0; 
    delay.tv_sec = 100000000L; 
    nanosleep(&delay, NULL); 
} 
+1

[mcve]を提供するために質問を編集してください。 –

+0

'cpu_set_t'と' CPU_ZERO'と 'CPU_SET'マクロを宣言する' #include'ファイルが見付かりません。 – Barmar

+0

@BaummitAugen彼は彼のソースファイル全体を投稿しました。 MCVEには何が必要ですか? – Barmar

答えて

0

:私は迅速な対応をありがとうございました。まず最初に、私はこのプログラムをコンパイルするためにCygwin for Windowsを使用していると述べていたはずです。第二に、私はポストを短くしないことを謝罪します。最後に、Cygwin自身がコード内でプロセッサの親和性を設定することをサポートしていないことを同僚に尋ねたところ、私は知りました。

ありがとうございました

関連する問題