'cpu_set_t'没有命名C ++类型 [英] 'cpu_set_t' does not name a type C++

查看:172
本文介绍了'cpu_set_t'没有命名C ++类型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在为分配构建速率单调调度程序,我需要让所有线程在同一处理器上运行.我不确定自己在做什么错,但是我仍然遇到相同的错误(请参见下图).我一直在浏览一堆Linux文档,以尝试找出解决方法,但我做不到.我真的很感谢您的帮助.预先感谢.

I'm working on building a rate monotonic scheduler for an assignment and I need to get all my threads to run on the same processor. I'm not sure what I'm doing wrong but I keep getting the same error (see pic below). I've been looking through a bunch of Linux documentation to try and figure out what to do but I just can't. I would really appreciate some help. Thanks in advance.

我的Scheduler.cpp文件:

My Scheduler.cpp file:

#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);
}

推荐答案

对所有回复此帖子的人:非常感谢您的迅速答复.首先,最重要的是,我可能应该提到我正在使用Windows的Cygwin来编译此程序.其次,我很抱歉没有缩短帖子的时间.最终,我在询问一位同事后发现Cygwin本身不支持在代码本身中设置处理器相似性.

To everyone who replied to this post: I thank you for the quick response. First and foremost I probably should have mentioned that I'm using Cygwin for Windows to compile this program. Secondly, I apologize for not making the post shorter. Finally, I found out after asking a colleague that Cygwin itself doesn't have support for setting processor affinity within code itself.

谢谢

这篇关于'cpu_set_t'没有命名C ++类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆