C++ 在线程函数c++;

C++ 在线程函数c++;,c++,multithreading,fstream,C++,Multithreading,Fstream,我正在做一个类项目,在让我的线程完全读取一个文件时遇到了麻烦。我可以让他们看完第一个或两个单词,然后他们停下来不输出任何东西。在我的main中,加入线程后,file.eof()返回true。有人对为什么会发生这种情况或如何解决它有什么建议吗 (该项目将使用交替线程对文件中短语中的元音和辅音进行“排序”;我不能使用互斥,这就是为什么会有turn变量) void cons(){ cout代码中的主要问题是,main线程关闭该文件,而另外两个线程在该文件上工作,因此设置eof位(线程无法再访问关闭的文

我正在做一个类项目,在让我的线程完全读取一个文件时遇到了麻烦。我可以让他们看完第一个或两个单词,然后他们停下来不输出任何东西。在我的
main
中,加入线程后,
file.eof()
返回true。有人对为什么会发生这种情况或如何解决它有什么建议吗

(该项目将使用交替线程对文件中短语中的元音和辅音进行“排序”;我不能使用互斥,这就是为什么会有turn变量)

void cons(){

cout代码中的主要问题是,
main
线程关闭该文件,而另外两个线程在该文件上工作,因此设置
eof
位(线程无法再访问关闭的
文件
)也就不足为奇了。 正确的纠正方法是在线程返回后关闭
文件
(即在每个线程从
join()返回后)然而,您的程序仍然存在一个主要缺陷,即您是如何设计
cons
函数和逻辑
|
使用的,出于明显的原因,我已将其替换为
&

  int main(int argc, char *argv[]) {
    {
        file.open("phrase.txt");
        file >> word;

    if (file.eof()){
        done = true;
    }

    std::thread vowelThread(vowel); //passing vow function 
    std::thread consThread(cons); //passing cons function


    cout << file.eof() << endl; //returns true

    //file.close(); <- closes file while your threads work on it, thus the eof bit is set

    vowelThread.join();
    consThread.join();
    file.close();
    cout << (file.eof()) << endl; //returns true
}
另一方面,现在您已经看到了
cons
中的错误,您可能会理解为什么我坚持要求您提供每个函数,而不是要求我们从另一个函数中推断出一个函数

还有最后一个问题(请注意,您的代码中有几个缺陷,为了继续讨论这个主题,我没有解决这些缺陷):最后一个单词
night
没有输出,因为当
cons
打印
The
时,它会将
night
加载到
word
中,并且设置了
eof
位,这意味着
元音
线程无法输入元音输出代码。这是一个设计流程,我相信您会知道如何操作地址


如果您需要进一步的精确性,请注意不要犹豫,请对我的答案发表评论。

文件是一个
std::fstream
?您在哪里定义
word
?请提供一个示例。如果您不能使用同步原语,您就不能使用并发。您希望从使用多个线程中获得什么还不清楚。我添加了我的全局帮助澄清此问题的变量。文件是一个ifstream全局变量。Word也是一个全局变量。因此,turn和done都是全局变量。它们是全局变量,因此线程可以访问它们。为了帮助澄清此问题,下面是一个代码应该执行的示例。在.txt文件“phrase.txt”中,有一个简单的短语,如“操作系统类在晚上开始”输出应该是元音线程:操作辅音线程:系统辅音线程:类等,直到文件被读取为止through@rhymeswithsilver这个问题现在是正确的(afaik)。在旁注中,最好使用
std::atomic
头(考虑到您不能使用互斥锁),以您这样做的方式使用交叉线程谢谢!这是有道理的。是的,代码肯定需要清理一下,因为我一直在戳它,试图弄清楚它。当然,你提到的大多数小事情都是我刚刚错过的,或者在我写它的时候没有充分考虑过的,所以它们应该很容易修复。谢谢你艾因:)@rhymswithsilver太好了,不客气。既然你的问题符合所有要求的标准,我也把它投了更高的票。
ifstream file;
string word;
bool turn = true; //true for vowel, false for cons
bool done = false;

int main(int argc, char *argv[]) {
{
    file.open("phrase.txt");
    file >> word;

    if (file.eof()){
        done = true;
    }

    std::thread vowelThread(vowel); //passing vow function 
    std::thread consThread(cons); //passing cons function


    cout << file.eof() << endl; //returns true

    file.close();

    vowelThread.join();
    consThread.join();

    cout << (file.eof()) << endl; //returns true
}
  int main(int argc, char *argv[]) {
    {
        file.open("phrase.txt");
        file >> word;

    if (file.eof()){
        done = true;
    }

    std::thread vowelThread(vowel); //passing vow function 
    std::thread consThread(cons); //passing cons function


    cout << file.eof() << endl; //returns true

    //file.close(); <- closes file while your threads work on it, thus the eof bit is set

    vowelThread.join();
    consThread.join();
    file.close();
    cout << (file.eof()) << endl; //returns true
}
void cons() {
    cout << "Turn is " << turn << endl; //outputs "Turn is 0"
    while (!file.eof()) {
        if (turn == false) {
            char c = word.at(0);
            if (c != 'A' && c != 'E' && c != 'I' && c != 'O' && c != 'U') {
                cout << "Consonant Thread: " << word << '\n';
                file >> word;
            }
            turn = true;
        }
        //this_thread::yield();
    }
}