![]() |
1
9
你当然有比赛条件。最严格的解决方案是保护共享变量的使用
|
![]() |
2
1
线程1调用update,获取当前时间的副本并将其保存在线程本地内存中。 线程2调用restart,将currentTime设置为newTime。螺纹2饰面。 线程1继续,将currentTime重新分配给其线程本地内存中的currentTime(这是重新启动调用之前currentTime的旧值)+timeDelay。螺纹1现在完成。 因此,重新启动将失败。还有许多其他情况会导致意外行为。始终同步不同线程之间共享的变量,以避免此类问题。 您应该使用其他人建议的互斥体。 |
![]() |
3
0
在每个函数中添加一些printf以创建正在发生的事情的日志。 例如,如果在“currentTime=newTime;”之后的另一个线程中立即执行update(),您希望发生什么?-或者更糟- 在期间 那一行的任务。 |
![]() |
4
0
从两个线程访问同一个变量(正如您所做的)需要某种同步。使用互斥体确保一次只有一个线程访问该变量,即:
问题是,在没有同步原语(如互斥体)的情况下,对同一个变量的访问对于线程是有问题的。假设update()读取currentTime,执行加法,但是在它可以存储结果之前,我们切换线程,restart()执行它。现在我们切换回update(),它将添加的结果(现在无效)写回currentTime,覆盖restart()的工作。互斥体通过允许您保证操作是原子的来防止这种情况。谷歌的一些教程-你需要知道很多其他的事情,如死锁。 创建/锁定互斥体的具体方式取决于您的操作系统/要使用的库。本机解决方案是*nix系统上的pthreads,Win32上的关键部分。(存在针对Win32的pthreads实现)Boost库也有一个线程部分。 |
![]() |
6
0
您有一个竞争条件,因为在进入关键区域时没有锁定,并且每个区域都在更新当前时间。每个线程都有一个内存,当一个线程需要从共享内存中获取某些内容时,它会将其复制到本地内存中。第一步是首先获取一个锁,然后清除它的内存,确保变量将从共享内存中加载。现在在关键区域中操作,一旦完成,就解锁关键区域,确保局部变量将写入共享内存。既然你没有锁,你就无法预测会发生什么。 使用互斥将是您的情况所需要的,因为只有一个键用于当前的时间变量。另一种锁是允许多个键的信号量。 |
![]() |
7
0
如果当前时间是真的 全局变量 就像你说的那样,你需要一个 全局互斥 保护变量。(pthread_mutex_initializer或boost.call_once construction) 在这种情况下,boost.threads示例是不正确的,因为生活在不同线程中的foo类的两个实例将具有不同的\u access mutex实例(我真的不喜欢\prefex!)并将锁定自己的实例,而不保护当前时间变量。 如果当前时间是一个实例变量,那么boost.threads示例是正确的。 |
![]() |
rookie · 检查函数模板的所有参数包参数是否属于int 1 年前 |
![]() |
ivaigult · -W转换和隐式字符串到布尔类型转换 1 年前 |
![]() |
rainer · 后台插入程序的初始化 1 年前 |
![]() |
Community wiki · 以理智、安全和高效的方式复制文件 1 年前 |
|
Shefali Kanaujia · 对C中向量的向量进行排序++ 1 年前 |
|
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |