current position:Home>Is it safe for C + + multithreading to read the same vector at the same time

Is it safe for C + + multithreading to read the same vector at the same time

2022-01-26 23:35:08 Xiao Shi of software engineering

One . Summary of problems

Two threads , Without a lock ,

  • A thread reads , A thread writes ;
  • Or two threads write at the same time ,

Will cause the process to crash .

If two threads read at the same time , There will be no problem without locking .

Two . Sample code

#include <boost/thread.hpp>
#include <vector>

using namespace std;
using namespace boost;
vector<int> g_vec;
void test()
{
    int a = 0;
    for(int i = 0; i< 100000000; ++ i)
    {
        a = g_vec[0];
    }
}

void test1()
{
    for(int i = 0; i< 100000000; ++ i)
    {
        g_vec.push_back(1);
    }
}
int main(int artc, char* argv[])
{
    g_vec.push_back(1);
    boost::thread thrd1(test);
    boost::thread thrd2(test1);
    thrd1.join();
    thrd2.join();
    return 0;
}

3、 ... and . The cause of the problem and the way to solve the problem

vector Is a simple container instead of an array , It does not need additional code and can realize the dynamic expansion of array length .
stay test1 In the method , Successive push_back It can lead to vector The internal array storage structure is constantly delete and new. stay test In the method , Access the first element of the array , It is possible that the internal structure at this time has been delete Not yet new.
The way to solve this problem is generally right vector The operation of is placed in a single thread or locked in the scope where this variable is used .
notes :vector Type of g_vec Even if declared as a local variable , There are only 32 Bytes , Reference resources vector Its internal implementation is the use of pointers new Memory on the heap .

https://segmentfault.com/a/1190000019081900?utm_source=tag-newest

Look up the information , original vector Every time push_back Will reallocate memory , Lead to goods This reference is invalid , therefore goods.local_pic = local_pic When the assignment is written, it will be written to an invalid address , Cause the program to crash .



author :coreki
link :https://www.jianshu.com/p/e240421aa5f4
source : Simple books
The copyright belongs to the author . Commercial reprint please contact the author for authorization , Non-commercial reprint please indicate the source .

copyright notice
author[Xiao Shi of software engineering],Please bring the original link to reprint, thank you.
https://en.cdmana.com/2022/01/202201262335050758.html

Random recommended