我目前正在嘗試在類中創建一種“工廠”模式,其實體應該是具有自己特定操作程序的執行緒。我目前已經宣告了一個全域變數isFinished以結束作業執行緒的操作,但是,不知何故在變數狀態改變后操作并沒有停止,并且作業執行緒沒有執行std::thread::join()操作以完成作業。我是執行緒的新手,一般來說在 C 中,我真的不知道有什么問題,所以任何幫助將不勝感激。
這是代碼:
\\main.cpp
#include <iostream>
#include <thread>
#include <atomic>
#include "Sender.h"
int main()
{
isFinished = false; //set false for worker thread
Sender mSender; //Create thread object for worker
std::cin.get(); //Trigger by pressing enter
isFinished = true; //exit worker while loop
mSender.join(); //wait for the worker thread to finish execution
}
\\sender.cpp
#include <iostream>
#include <thread>
#include <atomic>
#include "Sender.h"
void Sender::SenderWorkflow()
{
while (!isFinished)
{
std::cout << "Working... \n";
}
}
\\sender.h
#include <iostream>
#include <thread>
#include <atomic>
static std::atomic<bool> isFinished;
class Sender {
public:
std::thread worker;
Sender()
: worker(&Sender::SenderWorkflow, this)
{
}
void SenderWorkflow();
void join() {
worker.join(); \\std::thread::join()
}
};
uj5u.com熱心網友回復:
問題是您在全域范圍內使用了靜態變數。static在命名空間范圍內用于隱藏目標檔案中的變數或函式,以便聯結器在為另一個 cpp 檔案鏈接另一個目標檔案時無法看到它。實際上static只在 cpp 檔案本身內部使用。由于您在標頭中宣告了它,因此包含它的每個翻譯單元都將獲得該變數的不同實體,因為聯結器無法跨物件檔案看到相同的變數。要解決這個問題:
1- 將靜態變數的宣告移動到 cpp 檔案中,并在頭檔案中創建一個訪問器函式:
\\sender.h
#include <atomic>
const std::atomic<bool>& checkIsFinished();
void setFinished();
\\sender.cpp
static std::atomic<bool> isFinished;
const std::atomic<bool>& checkIsFinished() { return isFinished; }
void setFinished() { isFinished = true; }
2- 或在頭檔案中使用行內變數(c 17 起):
\\sender.h
#include <atomic>
inline std::atomic<bool> isFinished;
3 - 或更好且正確的設計:使區域變數成為類的成員,全域變數越少越好!
\\sender.h
#include <atomic>
class Sender {
public:
std::thread worker;
Sender()
: worker(&Sender::SenderWorkflow, this)
{
}
void SenderWorkflow();
void join() {
isFinished = true;
worker.join(); \\std::thread::join()
}
private:
std::atomic<bool> isFinished = false;
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/359334.html
