C++ C++;施工安全

C++ C++;施工安全,c++,multithreading,c++11,C++,Multithreading,C++11,在C++11中,我使用std::thread创建线程。我有一些全局变量: const int max_size = 78; const int cat[5] = {1, 20, 3, 40, 5}; 现在,如果我的线程读取这些变量,有没有识别行为的可能性?< p>只要这些变量从未被写入(是的,可以通过指针操作来写入C++中的代码> const < /COD>变量,但原因是什么?) 如果您担心未定义或未指定的行为(关于线程安全),您可以始终使用互斥 一个好的例子: // Globals cons

在C++11中,我使用
std::thread
创建线程。我有一些全局变量:

const int max_size = 78;
const int cat[5] = {1, 20, 3, 40, 5};

现在,如果我的线程读取这些变量,有没有识别行为的可能性?

< p>只要这些变量从未被写入(是的,可以通过指针操作来写入C++中的代码> const < /COD>变量,但原因是什么?) 如果您担心未定义或未指定的行为(关于线程安全),您可以始终使用互斥

一个好的例子:

// Globals
const int max_size = 78;
const int cat[5] = {1, 20, 3, 40, 5};

void call_from_thread() {
    std::cout << "Max Size: " << max_size << std::endl;
    std::cout << "cat[0]: " << cat[0] << std::endl;
    //..
    std::cout << "cat[4]: " << cat[4] << std::endl;
}

int main() {
    //Launch some threads
    std::thread thread1(call_from_thread);
    std::thread thread2(call_from_thread);

    //Join the threads with the main thread
    thread1.join();
    thread2.join();

    //..

    *((int*)&cat[3])=15; // Since threads are joined, this is OK as far as the write is concerned
    return 0;
}

只要这些变量从未被写入(是的,可以通过指针操作来写入<代码> const <代码>变量> C++,但是出于什么原因?) 如果您担心未定义或未指定的行为(关于线程安全),您可以始终使用互斥

一个好的例子:

// Globals
const int max_size = 78;
const int cat[5] = {1, 20, 3, 40, 5};

void call_from_thread() {
    std::cout << "Max Size: " << max_size << std::endl;
    std::cout << "cat[0]: " << cat[0] << std::endl;
    //..
    std::cout << "cat[4]: " << cat[4] << std::endl;
}

int main() {
    //Launch some threads
    std::thread thread1(call_from_thread);
    std::thread thread2(call_from_thread);

    //Join the threads with the main thread
    thread1.join();
    thread2.join();

    //..

    *((int*)&cat[3])=15; // Since threads are joined, this is OK as far as the write is concerned
    return 0;
}

在这种情况下,您应该是好的,虽然您可能是指行为。我不是在写const变量。C++定义了一个数据竞争,作为同时访问两个或多个线程的同一个内存位置,其中至少一个是修改。虽然你可能是指行为,我不是在写const变量。C++定义了一个数据竞争,作为两个或多个线程同时访问同一个内存位置,其中至少一个是一个修改。如果我删除了const,编辑主变量和开始线程,这些变量只读取变量,我仍然可以。“启动”线程是从主线程启动的,启动后不会发生后续写入操作,那么是的。如果我从cat数组中删除常量并启动5个线程传递给每个cat[I],我是否需要互斥锁?这些线程将写入cat[I]。此外,互斥锁会对性能造成影响,对吗?@Luka只要这些线程不写入
cat[i]
的位置,您就可以了。如果您通过
cat[i]
按值,这也没问题。
//这没问题
-不,不是这样,修改声明为
const的对象有未定义的行为。这不是数据竞争,但远不是“OK”。如果我删除const,编辑主线程上的变量,并启动仅读取变量的线程,我仍然可以?只要“start”命令“线程是从主线程启动的,启动后没有后续写操作发生,那么是的。如果我从cat数组中删除常量并启动5个线程传递给每个cat[I],我需要互斥吗?”?这些线程将写入cat[i]。另外,互斥锁会对性能产生影响,对吗?@Luka只要这些线程不写入到
cat[i]
的位置,就可以了。如果您通过值传递
cat[i]
,也可以。
//这没问题
-不,不是这样,修改声明为
const
的对象具有未定义的行为。这不是一场数据竞赛,但远不是“好的”