分页: 1 / 1
一头雾水,C++有防止线程冲突的硬机制吗?
发表于 : 2022年 9月 24日 01:03
由 minquan
因为工作需要,不得不接触点C++
现在发现两个线程间必须要有共享数据,有全局变量,也有对象的attribute
我好像没找到C++硬性防止线程冲突的设计,如果那个全局变量被一个线程读的同时被另一个线程写,会发生冲突崩溃吗?
这个玩意儿在go叫race,不知道C++有没有什么安全的处理办法,除了那堆糟心的* &语法
Re: 一头雾水,C++有防止线程冲突的硬机制吗?
发表于 : 2022年 9月 24日 01:33
由 whitepaper
要保证数据一致或完整的话,一般来说要加锁,但如果你不担心数据错乱,应该没问题,随便读写。
Re: 一头雾水,C++有防止线程冲突的硬机制吗?
发表于 : 2022年 9月 24日 01:49
由 fhnan
minquan 写了: 2022年 9月 24日 01:03
因为工作需要,不得不接触点C++
现在发现两个线程间必须要有共享数据,有全局变量,也有对象的attribute
我好像没找到C++硬性防止线程冲突的设计,如果那个全局变量被一个线程读的同时被另一个线程写,会发生冲突崩溃吗?
这个玩意儿在go叫race,不知道C++有没有什么安全的处理办法,除了那堆糟心的* &语法
互斥锁
Re: 一头雾水,C++有防止线程冲突的硬机制吗?
发表于 : 2022年 9月 24日 01:51
由 minquan
fhnan 写了: 2022年 9月 24日 01:49互斥锁
也就是说,C++本身是根本没有这个机制的,必须还得手工去建立互斥锁保护的全局变量对吗?
Re: 一头雾水,C++有防止线程冲突的硬机制吗?
发表于 : 2022年 9月 24日 01:52
由 minquan
whitepaper 写了: 2022年 9月 24日 01:33
要保证数据一致或完整的话,一般来说要加锁,但如果你不担心数据错乱,应该没问题,随便读写。
不是这样。即使是bool变量,在go中测race也会崩。
好像是只要发生了同时读写,就必崩无疑。
Re: 一头雾水,C++有防止线程冲突的硬机制吗?
发表于 : 2022年 9月 24日 01:58
由 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;
...
}
// 其他任务
}
Re: 一头雾水,C++有防止线程冲突的硬机制吗?
发表于 : 2022年 9月 24日 03:18
由 tekkamanz
啥叫硬机制?语言自带的特性?那没有 c就是最基本的东西 但是有无数的库来实现你说的那些花里胡哨的东西
Re: 一头雾水,C++有防止线程冲突的硬机制吗?
发表于 : 2022年 9月 24日 06:55
由 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;
...
}
// 其他任务
}
谢谢!
看来真得手搓一个。
Re: 一头雾水,C++有防止线程冲突的硬机制吗?
发表于 : 2022年 9月 24日 08:43
由 omicron
你这个码农当的不合格
连锁是操作系统提供都不知道,怎么可能是编程语言提供锁
如果你不是科班的码农,记住可以找第三方库,提供api调用OS锁的API,或者直接用操作系统锁的API
C++这种底层语言设计,是不可能有锁这种hardware 和OS dependent的东西的,python还差不多
Re: 一头雾水,C++有防止线程冲突的硬机制吗?
发表于 : 2022年 9月 24日 09:16
由 minquan
omicron 写了: 2022年 9月 24日 08:43
你这个码农当的不合格
连锁是操作系统提供都不知道,怎么可能是编程语言提供锁
如果你不是科班的码农,记住可以找第三方库,提供api调用OS锁的API,或者直接用操作系统锁的API
C++这种底层语言设计,是不可能有锁这种hardware 和OS dependent的东西的,python还差不多
扯淡。你连mutex都不知道
我不用mutex的时候,在go里编写一个线程读全局变量,另一个去改,结果go build race报了一堆错。
Re: 一头雾水,C++有防止线程冲突的硬机制吗?
发表于 : 2022年 9月 24日 11:21
由 omicron
minquan 写了: 2022年 9月 24日 09:16
扯淡。你连mutex都不知道
我不用mutex的时候,在go里编写一个线程读全局变量,另一个去改,结果go build race报了一堆错。
你是转行大妈吧,连mutex怎么实现都不知道?mutex都是实现在OS内核里的
看你们这些转行大妈,连基本概念都不懂,就敢去写多线程程序?
我给你说清楚为啥,免得你不懂装懂,瞎反驳又露怯
多个线程竞争锁,竟争不到的要进入sleep,便于操纵系统调度,这也是为啥锁都实现在内核的原因
你不通过内核只能做spin lock,占用大量CPU,没人在内核外做spin lock
Re: 一头雾水,C++有防止线程冲突的硬机制吗?
发表于 : 2022年 9月 24日 22:15
由 subsub1
民权老师水平堪忧啊。。
Re: 一头雾水,C++有防止线程冲突的硬机制吗?
发表于 : 2022年 9月 24日 22:37
由 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,估计转码大妈就湿了
Re: 一头雾水,C++有防止线程冲突的硬机制吗?
发表于 : 2022年 9月 25日 00:56
由 minquan
omicron 写了: 2022年 9月 24日 11:21
你是转行大妈吧,连mutex怎么实现都不知道?mutex都是实现在OS内核里的
看你们这些转行大妈,连基本概念都不懂,就敢去写多线程程序?
我给你说清楚为啥,免得你不懂装懂,瞎反驳又露怯
多个线程竞争锁,竟争不到的要进入sleep,便于操纵系统调度,这也是为啥锁都实现在内核的原因
你不通过内核只能做spin lock,占用大量CPU,没人在内核外做spin lock
我是转行啊,具体实现机制不了解。不过这种防崩溃的东西应该是语言设计中最重要的吧?
怎么C++搞了一大堆* &指针引用语法,对于这种最关键的东西没有自动保护机制?逼得程序员手动去上锁?
我还以为在之后的高级C++语法,smart pointer自带这种保护锁呢。
咱就说应用,smart pointer是否自带读写互斥锁?还是我得专门一对一的给各个smart pointer建锁?
Re: 一头雾水,C++有防止线程冲突的硬机制吗?
发表于 : 2022年 9月 25日 01:57
由 bihai
minquan 写了: 2022年 9月 25日 00:56
我是转行啊,具体实现机制不了解。不过这种防崩溃的东西应该是语言设计中最重要的吧?
怎么C++搞了一大堆* &指针引用语法,对于这种最关键的东西没有自动保护机制?逼得程序员手动去上锁?
我还以为在之后的高级C++语法,smart pointer自带这种保护锁呢。
咱就说应用,smart pointer是否自带读写互斥锁?还是我得专门一对一的给各个smart pointer建锁?
shared_ptr的读写计数是线程安全的。但是其内容需要你自己保护。
Re: 一头雾水,C++有防止线程冲突的硬机制吗?
发表于 : 2022年 10月 3日 11:24
由 garphy
C++之所以比别的语言快,就是因为少了很多特性。这些东西都是有资源开销的。不过现代c++能自己回收内存了,以后说不定啥都能做也未可知。