我寫了這個示例程序來模仿我試圖在一個更大的程序中做什麼。線程與原子和互斥類的內部類
我有一些數據會來自用戶,並被傳遞到一個線程進行一些處理。我正在使用數據周圍的互斥標記來標記有數據時的信號。
使用lambda表達式,是指向*發送到線程的指針嗎?我似乎正在得到我期望在cout聲明中的行爲。
互斥數據是否正確使用了數據?
是否將原子和互斥體作爲該類的私人成員的一個好動作?
foo.h中
#pragma once
#include <atomic>
#include <thread>
#include <vector>
#include <mutex>
class Foo
{
public:
Foo();
~Foo();
void StartThread();
void StopThread();
void SendData();
private:
std::atomic<bool> dataFlag;
std::atomic<bool> runBar;
void bar();
std::thread t1;
std::vector<int> data;
std::mutex mx;
};
foo.c的
#include "FooClass.h"
#include <thread>
#include <string>
#include <iostream>
Foo::Foo()
{
dataFlag = false;
}
Foo::~Foo()
{
StopThread();
}
void Foo::StartThread()
{
runBar = true;
t1 = std::thread([=] {bar(); });
return;
}
void Foo::StopThread()
{
runBar = false;
if(t1.joinable())
t1.join();
return;
}
void Foo::SendData()
{
mx.lock();
for (int i = 0; i < 5; ++i) {
data.push_back(i);
}
mx.unlock();
dataFlag = true;
}
void Foo::bar()
{
while (runBar)
{
if(dataFlag)
{
mx.lock();
for(auto it = data.begin(); it < data.end(); ++it)
{
std::cout << *it << '\n';
}
mx.unlock();
dataFlag = false;
}
}
}
的main.cpp
#include "FooClass.h"
#include <iostream>
#include <string>
int main()
{
Foo foo1;
std::cout << "Type anything to end thread" << std::endl;
foo1.StartThread();
foo1.SendData();
// type something to end threads
char a;
std::cin >> a;
foo1.StopThread();
return 0;
}
使用std :: lock_guard,而不是手動調用mx.lock()/解鎖() –
當您啓動線程,你應該是'加入() 'it or'detach()' –
@DmitryKatkevich爲什麼?他稍後加入()'... – vu1p3n0x