线程同步C++
Thread Synchronization C++
我在线程方面遇到了这个奇怪的问题。在我的mac OS X上,这很好用,但一旦我把它放在运行Ubuntu的桌面上,我就会面临问题。
本质上,我正在做的是:
Function() {
for(i = 1 to 10)
while(array not completely changed) {
pthread_mutex_lock(&lock);
-- perform actions
pthread_mutex_unlock(&unlock);
}
}
}
我有两个线程在运行这个函数。虽然它应该以这样的方式运行,即:
Thread 1 grabs lock
performs opperations on array
Thread 1 releases lock
Thread 2 grabs lock
performs calculations on array
Thread 2 releases lock
等等,直到阵列已经完成改变,但在Linux上,线程1的所有计算都完成了,然后线程2开始。
所以我会得到:
Thread 1 grabs lock
performs opperations on array
Thread 1 releases lock
Thread 1 grabs lock
performs calculations on array
Thread 1 releases lock
Thread 1 grabs lock
performs calculations on array
Thread 1 releases lock
依此类推,直到数组完全更改,一旦我增加for循环,线程2将执行所有计算并继续此模式。
有人能解释一下发生了什么吗?
您正在经历"饥饿"。偶尔添加一个小的nanosleep
调用,给其他线程一个运行的机会。在互斥对之外添加调用(例如,在解锁之后)。线程1正在垄断事物。
您可能还想考虑重组和拆分关键[需要锁定]与非关键工作:
while (more) {
lock ...
do critical stuff ...
unlock ...
nanosleep ...
do non-critical stuff
}
相关文章:
- 松弛原子与无同步情况下的记忆连贯性
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 在C++中同步线程
- 与 stdio 同步是否使程序 I/O 非交互式?
- 如何在qt中同步应用程序和显示器的刷新率?
- Windows 进程间同步类似事件?
- 当对套接字 send() 的同步调用由于连接另一端丢失而被阻止时,如何恢复?
- 将 10 个线程与原子布尔值同步
- ofstream::close() 是否在 Linux 上调用同步?
- 与Visual Studios(c ++)同步时如何组织github存储库?
- 原子获取是否与互斥锁释放同步?
- Boost (Beast) websocket:同步写入挂起
- Postgres vs MySQL:命令不同步;.
- 线程过程中的线程同步问题
- 同步读取多个 TCP 响应
- 同步两个具有不同帧速率的传感器
- 如何定期同步线程?
- 同步对多个向量进行排序
- 同步类中的公共变量
- 如何检查 ntpd 是否仍在运行和同步