在 C++ 中将 Mutex 和 lock_guard 与向量一起使用

Hus*_*mov 1 c++ multithreading c++11

我是 C++ 线程的新手。我需要您有关mutexand的使用的帮助lock_guard(这部分并不重要)。我有一个主要功能和一个次要功能。

lock_guard(mtx)请告诉我为什么当我添加;时多线程不起作用 当我删除它时,它运行得更快但错误。你能帮我吗?

我需要正确访问向量vec并启用线程。

#include <vector>
#include <thread>

std::mutex mtx;

void threadCall(std::vector<int> &vec, int start, int end){
    std::lock_guard<std::mutex> guard(mtx);
    for(int i=start; i<end; i++)
      vec[i] = i;
}

void ThreadFunc(std::vector<int> vec){
    std::vector<std::thread> threads(2);
    threads[0] = std::thread(&threadCall, std::ref(vec), 0, 10);
    threads[1] = std::thread(&threadCall, std::ref(vec), 10, 20);

    threads[0].join();
    threads[1].join();
}

int main(){

    std::vector<int> vec(20);
    ThreadFunc(vec);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*rew 5

互斥锁阻止线程并行执行任何工作。只要您可以保证每个线程不会写入向量的同一部分,您就根本不需要互斥体。

另一个问题是您按值传递向量。您应该通过引用传递:

void threadCall(std::vector<int>& vec, int start, int end){
    for(int i=start; i<end; i++)
      vec[i] = i;
}

void ThreadFunc(std::vector<int>& vec){
    std::vector<std::thread> threads(2);
    threads[0] = std::thread(&threadCall, std::ref(vec), 0, 10);
    threads[1] = std::thread(&threadCall, std::ref(vec), 10, 20);

    threads[0].join();
    threads[1].join();
}

int main(){
    std::vector<int> vec(20);
    ThreadFunc(vec);
}
Run Code Online (Sandbox Code Playgroud)

现场演示

  • 我建议你用更接近你实际问题的代码写一个问题。 (2认同)

Sto*_*ica 5

首先,停止按值传递向量,传递引用。解决之后,您的特定示例实际上根本不需要互斥体。你的向量有固定的大小:

std::vector<int> vec(20);
Run Code Online (Sandbox Code Playgroud)

所有元素都是从一开始就默认构建的。由于您所做的只是分配:

vec[i] = i;
Run Code Online (Sandbox Code Playgroud)

该向量不会重新分配任何存储空间或调整其项目数量。因此无需锁定对整个向量的访问。再加上每个线程在单独的子范围上运行的事实,并且不存在任何数据竞争。您不需要同步原语。