Her*_*ber 1 c++ multithreading raytracing thread-safety
这是我的第一个多线程实现,所以这可能是初学者的错误.线程处理每隔一行像素的渲染(因此所有渲染都在每个线程内处理).如果线程分别渲染屏幕的上部和下部,则问题仍然存在.
两个线程从相同的变量读取,这会导致任何问题吗?据我所知,只有写作才会导致并发问题......
可以调用相同的函数导致任何并发问题吗?而且,从我的理解,这应该不是一个问题......
两个线程写入同一变量的唯一时间是保存计算的像素颜色.它存储在一个数组中,但它们永远不会写入该数组中的相同索引.这会导致问题吗?
多线程渲染图像 (垃圾邮件防止阻止我直接发布图像..)
PS.我在两种情况下使用完全相同的实现,唯一的区别是为渲染创建的单个线程与两个线程.
两个线程从相同的变量读取,这会导致任何问题吗?据我所知,只有写作才会导致并发问题......
这应该没问题.显然,只要数据在两个线程开始读取之前被初始化,并且在两个线程完成之后就被销毁.
可以调用相同的函数导致任何并发问题吗?而且,从我的理解,这应该不是一个问题......
是的,不是.没有代码就太难说了.这个功能有什么作用?它是否依赖于共享状态(例如static变量,全局变量,单例......)?如果是的话,那肯定是个问题.如果从来没有任何共享状态,那么你没问题.
两个线程写入同一变量的唯一时间是保存计算的像素颜色.它存储在一个数组中,但它们永远不会写入该数组中的相同索引.这会导致问题吗?
也许有时候.一阵什么?它可能是安全的sizeof(element) == sizeof(void*),但是C++标准在多线程上是静音的,所以它不会强迫你的编译器强制你的硬件使这个安全.您的平台可能会在这里咬你(例如64位机器和一个写32位的线程可能会覆盖相邻的32位值),但这不是一种罕见的模式.通常你最好使用同步来确定.
您可以通过以下几种方式解决此问题:
在我的答案中缺乏承诺是使多线程编程变得困难的原因:P
例如,从英特尔®64和IA-32架构软件开发人员手册中,描述了不同平台如何保持不同的原子级别:
7.1.1保证原子操作
Intel486处理器(以及之后的新处理器)保证始终以原子方式执行以下基本内存操作:
- 读或写一个字节
- 读取或写入在16位边界上对齐的字
- 读取或写入在32位边界上对齐的双字
奔腾处理器(以及更新的处理器)保证以下额外的内存操作将始终以原子方式执行:
- 读取或写入在64位边界上对齐的四字
- 16位访问非缓存内存位置,适合32位数据总线
P6系列处理器(以及之后的新处理器)保证以下额外的内存操作将始终以原子方式执行:
- 未对齐的16位,32位和64位访问缓存内存,适合缓存行
英特尔酷睿2双核处理器,英特尔凌动,英特尔酷睿双核处理器,奔腾M,奔腾4,英特尔至强,P6系列,奔腾,无法保证对可缓存的内存进行访问,这些内存分布在总线宽度,缓存行和页面边界上和Intel486处理器.Intel Core 2 Duo,Intel Atom,Intel Core Duo,Pentium M,Pentium 4,Intel Xeon和P6系列处理器提供总线控制信号,允许外部存储器子系统将分离访问原子化; 但是,非对齐数据访问会严重影响处理器的性能,应该避免.
| 归档时间: |
|
| 查看次数: |
796 次 |
| 最近记录: |