我一直在尝试学习如何多线程并得出以下理解。我想知道我是正确的还是遥远的,如果我在任何方面都不正确,是否有人可以给我建议。
要创建线程,首先您需要使用诸如<thread>
或任何替代库之类的库(我正在使用 boost 的多线程库来获得跨平台功能)。之后,您可以通过声明它来创建一个线程 (for std::thread
)
std::thread thread (foo);
现在,您可以使用thread.join()
或thread.detach()
。前者会等到线程结束,然后再继续;同时,后者将与您计划执行的任何操作一起运行线程。
如果你想保护一些东西,比如 vector std::vector<double> data
,不受线程同时访问的影响,你会使用互斥锁。
互斥锁将被声明为全局变量,以便它们可以访问线程函数(或者,如果您正在创建一个将是多线程的类,则可以将互斥锁声明为该类的私有/公共变量)。之后,您可以使用互斥锁锁定和解锁线程。
让我们快速看一下这个示例伪代码:
std::mutex mtx;
std::vector<double> data;
void threadFunction(){
// Do stuff
// ...
// Want to access a global variable
mtx.lock();
data.push_back(3.23);
mtx.unlock();
// Continue
}
在这段代码中,当互斥锁锁定线程时,它只锁定它和mtx.unlock()
. 因此,其他线程仍然会继续他们的快乐方式,直到他们尝试访问数据(注意,我们也可能通过其他线程中的互斥锁)。然后他们会停下来,等待使用数据,锁定它push_back
,解锁它并继续。检查here以获得对互斥锁的良好描述。
这就是我对多线程的理解。那么,我是大错特错还是准确无误?