我有一个涉及多线程问题的学校作业。我不是在这里请求帮助解决具体问题,特别是因为我还没有到达那里。对于这个赋值,我必须定义一些从提供的Thread类继承的类。对于这个定义,我有一个主文件(thread.cpp),一个头文件(thread.h)和一个支持文件,其中包含由thread.cpp(thread-support.cpp)中定义的类调用的函数。 / p>
thread.h看起来像这样:
#ifndef _THREAD_H
#define _THREAD_H
#include <stdbool.h>
#include "ThreadClass.h"
Mutex potLock;
Mutex mamaLock;
Semaphore sleepyMama("SleepyMama", 0);
bool awake = false;
class Mama : public Thread {
public:
Mama();
private:
void ThreadFunc();
void goto_sleep();
void food_ready();
};
class Baby : public Thread {
public:
Baby(int id, Mutex* pots);
private:
void ThreadFunc();
int id;
Mama mama;
Mutex *pots;
void ready_to_eat();
void finish_eating();
};
#endif
thread.cpp看起来像这样:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include "thread.h"
using namespace std;
Baby::Baby(int ID, Mutex feedPots[]) :
id(ID), pots(feedPots)
{
ThreadName.seekp(0, ios::beg);
ThreadName << "Baby" << id << '\0';
}
void Baby::ThreadFunc() {
Thread::ThreadFunc();
mamaLock.Lock();
if (!awake) {
sleepyMama.Signal();
}
mamaLock.Unlock();
Exit();
}
Mama::Mama()
{
ThreadName.seekp(0, ios::beg);
ThreadName << "Mama" << '\0';
}
void Mama::ThreadFunc() {
char buf[200];
Thread::ThreadFunc();
sprintf(buf, "Mama started\n");
write(1, buf, strlen(buf));
goto_sleep();
sprintf(buf, "Mama woke up!\n");
write(1, buf, strlen(buf));
}
而thread-support.cpp目前看起来像这样:
#include <stdbool.h>
#include "thread.h"
void Mama::goto_sleep() {
mamaLock.Lock();
awake = false;
mamaLock.Unlock();
sleepyMama.Wait();
}
目前,我正在使用一个Makefile,它将每个.cpp文件编译成.o文件,使用带有标志-g和-02的g ++(因为这是我们的示例文件所具有的)以及其他标志使其工作与我们古老的自定义线程库。可执行文件使用命令c++ [custom library flags] -g -02 -o prog4 thread.o thread-support.o thread-main.o
进行编译,其中thread-main.cpp是包含main.h函数的文件,其中包含thread.h。 thread.h中的Mutexes,Semaphore和bool需要可以被thread.cpp和thread-support.cpp访问,但如果我在两个文件中包含thread.h,我会遇到多个定义问题。我在thread-main中也遇到了多个定义问题。
答案 0 :(得分:1)
Thread.cpp
应该定义这些变量:
Mutex potLock;
Mutex mamaLock;
Semaphore sleepyMama("SleepyMama", 0);
bool awake = false;
虽然Thread.h
应该只声明它们:
extern Mutex potLock;
extern Mutex mamaLock;
extern Semaphore sleepyMama;
extern bool awake;
您应始终(在大多数情况下)在.cpp
文件中定义变量。标题应该只包含前向声明,以使某些符号对其他模块可见。
修改强>
要在thread-support.cpp
中使用这些符号,您可以:
1) #include Thread.h
2)手动声明 - 在thread-support.cpp
添加:
extern Mutex potLock;
extern Mutex mamaLock;
extern Semaphore sleepyMama;
extern bool awake;
答案 1 :(得分:-1)
那是因为你没有使用标题保护。
在头文件中或包含thread.h的任何地方
用这个
包裹它//此处的所有代码
使用完整的头文件替换所有代码,然后在include语句的线程支持中使用它