一头雾水,C++有防止线程冲突的硬机制吗?

版主: hci

回复
头像
minquan(三民主义)楼主
论坛精英
论坛精英
帖子互动: 181
帖子: 7178
注册时间: 2022年 7月 29日 09:12

一头雾水,C++有防止线程冲突的硬机制吗?

帖子 minquan(三民主义)楼主 »

因为工作需要,不得不接触点C++

现在发现两个线程间必须要有共享数据,有全局变量,也有对象的attribute

我好像没找到C++硬性防止线程冲突的设计,如果那个全局变量被一个线程读的同时被另一个线程写,会发生冲突崩溃吗?

这个玩意儿在go叫race,不知道C++有没有什么安全的处理办法,除了那堆糟心的* &语法
图片
whitepaper
著名点评
著名点评
帖子互动: 75
帖子: 5064
注册时间: 2022年 7月 23日 01:07
来自: 平凡的地方

Re: 一头雾水,C++有防止线程冲突的硬机制吗?

帖子 whitepaper »

要保证数据一致或完整的话,一般来说要加锁,但如果你不担心数据错乱,应该没问题,随便读写。
路见不平,怼几句。
fhnan
论坛支柱
论坛支柱
2024年度优秀版主
帖子互动: 488
帖子: 11306
注册时间: 2022年 7月 29日 00:50

Re: 一头雾水,C++有防止线程冲突的硬机制吗?

帖子 fhnan »

minquan 写了: 2022年 9月 24日 01:03 因为工作需要,不得不接触点C++

现在发现两个线程间必须要有共享数据,有全局变量,也有对象的attribute

我好像没找到C++硬性防止线程冲突的设计,如果那个全局变量被一个线程读的同时被另一个线程写,会发生冲突崩溃吗?

这个玩意儿在go叫race,不知道C++有没有什么安全的处理办法,除了那堆糟心的* &语法
互斥锁
买买提纪检委书记 sex版版主
头像
minquan(三民主义)楼主
论坛精英
论坛精英
帖子互动: 181
帖子: 7178
注册时间: 2022年 7月 29日 09:12

Re: 一头雾水,C++有防止线程冲突的硬机制吗?

帖子 minquan(三民主义)楼主 »

fhnan 写了: 2022年 9月 24日 01:49互斥锁
也就是说,C++本身是根本没有这个机制的,必须还得手工去建立互斥锁保护的全局变量对吗?
图片
头像
minquan(三民主义)楼主
论坛精英
论坛精英
帖子互动: 181
帖子: 7178
注册时间: 2022年 7月 29日 09:12

Re: 一头雾水,C++有防止线程冲突的硬机制吗?

帖子 minquan(三民主义)楼主 »

whitepaper 写了: 2022年 9月 24日 01:33 要保证数据一致或完整的话,一般来说要加锁,但如果你不担心数据错乱,应该没问题,随便读写。
不是这样。即使是bool变量,在go中测race也会崩。

好像是只要发生了同时读写,就必崩无疑。
图片
bihai
见习点评
见习点评
帖子互动: 55
帖子: 1378
注册时间: 2022年 7月 24日 20:58

Re: 一头雾水,C++有防止线程冲突的硬机制吗?

帖子 bihai »

minquan 写了: 2022年 9月 24日 01:03 因为工作需要,不得不接触点C++

现在发现两个线程间必须要有共享数据,有全局变量,也有对象的attribute

我好像没找到C++硬性防止线程冲突的设计,如果那个全局变量被一个线程读的同时被另一个线程写,会发生冲突崩溃吗?

这个玩意儿在go叫race,不知道C++有没有什么安全的处理办法,除了那堆糟心的* &语法
定义一个mutex,然后每次用一个lock_guard保护数据读写。

int g_i = 0;
std::mutex g_i_mutex; // 保护 g_i

void safe_write()
{
// 其他任务

// 访问共享变量
{
const std::lock_guard<std::mutex> lock(g_i_mutex);
++g_i;
}

// 其他任务
}

void safe_read()
{
// 其他任务

// 访问共享变量
{
const std::lock_guard<std::mutex> lock(g_i_mutex);
double x = g_i + 5.4;
double y = sin(x)*g_i;
...
}

// 其他任务
}
tekkamanz
论坛精英
论坛精英
帖子互动: 119
帖子: 6004
注册时间: 2022年 8月 4日 17:39

Re: 一头雾水,C++有防止线程冲突的硬机制吗?

帖子 tekkamanz »

啥叫硬机制?语言自带的特性?那没有 c就是最基本的东西 但是有无数的库来实现你说的那些花里胡哨的东西
理想世界地图
图片
头像
minquan(三民主义)楼主
论坛精英
论坛精英
帖子互动: 181
帖子: 7178
注册时间: 2022年 7月 29日 09:12

Re: 一头雾水,C++有防止线程冲突的硬机制吗?

帖子 minquan(三民主义)楼主 »

bihai 写了: 2022年 9月 24日 01:58 定义一个mutex,然后每次用一个lock_guard保护数据读写。

int g_i = 0;
std::mutex g_i_mutex; // 保护 g_i

void safe_write()
{
// 其他任务

// 访问共享变量
{
const std::lock_guard<std::mutex> lock(g_i_mutex);
++g_i;
}

// 其他任务
}

void safe_read()
{
// 其他任务

// 访问共享变量
{
const std::lock_guard<std::mutex> lock(g_i_mutex);
double x = g_i + 5.4;
double y = sin(x)*g_i;
...
}

// 其他任务
}
谢谢!
看来真得手搓一个。
图片
头像
omicron
论坛点评
论坛点评
帖子互动: 76
帖子: 3042
注册时间: 2022年 7月 26日 16:25

Re: 一头雾水,C++有防止线程冲突的硬机制吗?

帖子 omicron »

你这个码农当的不合格

连锁是操作系统提供都不知道,怎么可能是编程语言提供锁

如果你不是科班的码农,记住可以找第三方库,提供api调用OS锁的API,或者直接用操作系统锁的API

C++这种底层语言设计,是不可能有锁这种hardware 和OS dependent的东西的,python还差不多
头像
minquan(三民主义)楼主
论坛精英
论坛精英
帖子互动: 181
帖子: 7178
注册时间: 2022年 7月 29日 09:12

Re: 一头雾水,C++有防止线程冲突的硬机制吗?

帖子 minquan(三民主义)楼主 »

omicron 写了: 2022年 9月 24日 08:43 你这个码农当的不合格

连锁是操作系统提供都不知道,怎么可能是编程语言提供锁

如果你不是科班的码农,记住可以找第三方库,提供api调用OS锁的API,或者直接用操作系统锁的API

C++这种底层语言设计,是不可能有锁这种hardware 和OS dependent的东西的,python还差不多
扯淡。你连mutex都不知道

我不用mutex的时候,在go里编写一个线程读全局变量,另一个去改,结果go build race报了一堆错。
图片
头像
omicron
论坛点评
论坛点评
帖子互动: 76
帖子: 3042
注册时间: 2022年 7月 26日 16:25

Re: 一头雾水,C++有防止线程冲突的硬机制吗?

帖子 omicron »

minquan 写了: 2022年 9月 24日 09:16 扯淡。你连mutex都不知道

我不用mutex的时候,在go里编写一个线程读全局变量,另一个去改,结果go build race报了一堆错。
你是转行大妈吧,连mutex怎么实现都不知道?mutex都是实现在OS内核里的

看你们这些转行大妈,连基本概念都不懂,就敢去写多线程程序?

我给你说清楚为啥,免得你不懂装懂,瞎反驳又露怯

多个线程竞争锁,竟争不到的要进入sleep,便于操纵系统调度,这也是为啥锁都实现在内核的原因

你不通过内核只能做spin lock,占用大量CPU,没人在内核外做spin lock
头像
subsub1(减减)
论坛点评
论坛点评
subsub1 的博客
帖子互动: 65
帖子: 2850
注册时间: 2022年 7月 22日 00:48

Re: 一头雾水,C++有防止线程冲突的硬机制吗?

帖子 subsub1(减减) »

民权老师水平堪忧啊。。
老将
★☆✭✰✫克星✫✰✭☆★
敬请欣赏《老将泪》
► 显示剧情透露
HiYou
论坛点评
论坛点评
帖子互动: 150
帖子: 3229
注册时间: 2022年 7月 24日 15:34

Re: 一头雾水,C++有防止线程冲突的硬机制吗?

帖子 HiYou »

omicron 写了: 2022年 9月 24日 08:43 你这个码农当的不合格

连锁是操作系统提供都不知道,怎么可能是编程语言提供锁

如果你不是科班的码农,记住可以找第三方库,提供api调用OS锁的API,或者直接用操作系统锁的API

C++这种底层语言设计,是不可能有锁这种hardware 和OS dependent的东西的,python还差不多
scheduler最后还是要靠的类似 test and set或者compare and swap这样的instruction level支持

不过你给大妈说多了,要是再提一句lock free和wait free,估计转码大妈就湿了
头像
minquan(三民主义)楼主
论坛精英
论坛精英
帖子互动: 181
帖子: 7178
注册时间: 2022年 7月 29日 09:12

Re: 一头雾水,C++有防止线程冲突的硬机制吗?

帖子 minquan(三民主义)楼主 »

omicron 写了: 2022年 9月 24日 11:21 你是转行大妈吧,连mutex怎么实现都不知道?mutex都是实现在OS内核里的

看你们这些转行大妈,连基本概念都不懂,就敢去写多线程程序?

我给你说清楚为啥,免得你不懂装懂,瞎反驳又露怯

多个线程竞争锁,竟争不到的要进入sleep,便于操纵系统调度,这也是为啥锁都实现在内核的原因

你不通过内核只能做spin lock,占用大量CPU,没人在内核外做spin lock
我是转行啊,具体实现机制不了解。不过这种防崩溃的东西应该是语言设计中最重要的吧?

怎么C++搞了一大堆* &指针引用语法,对于这种最关键的东西没有自动保护机制?逼得程序员手动去上锁?

我还以为在之后的高级C++语法,smart pointer自带这种保护锁呢。

咱就说应用,smart pointer是否自带读写互斥锁?还是我得专门一对一的给各个smart pointer建锁?
图片
bihai
见习点评
见习点评
帖子互动: 55
帖子: 1378
注册时间: 2022年 7月 24日 20:58

Re: 一头雾水,C++有防止线程冲突的硬机制吗?

帖子 bihai »

minquan 写了: 2022年 9月 25日 00:56 我是转行啊,具体实现机制不了解。不过这种防崩溃的东西应该是语言设计中最重要的吧?

怎么C++搞了一大堆* &指针引用语法,对于这种最关键的东西没有自动保护机制?逼得程序员手动去上锁?

我还以为在之后的高级C++语法,smart pointer自带这种保护锁呢。

咱就说应用,smart pointer是否自带读写互斥锁?还是我得专门一对一的给各个smart pointer建锁?
shared_ptr的读写计数是线程安全的。但是其内容需要你自己保护。
garphy
小有名气
小有名气
帖子互动: 0
帖子: 49
注册时间: 2022年 7月 27日 13:10

Re: 一头雾水,C++有防止线程冲突的硬机制吗?

帖子 garphy »

C++之所以比别的语言快,就是因为少了很多特性。这些东西都是有资源开销的。不过现代c++能自己回收内存了,以后说不定啥都能做也未可知。
回复

回到 “葵花宝典(Programming)”