2017-05-03 68 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本身不支持在代碼本身內設置處理器關聯。

謝謝