C++ 线程同步C++;
我有一个关于线程的奇怪问题。在我的mac和OSX上,这很好,但一旦我把它转到运行Ubuntu的桌面上,我就面临着问题 基本上,我所做的是:C++ 线程同步C++;,c++,arrays,multithreading,pthreads,C++,Arrays,Multithreading,Pthreads,我有一个关于线程的奇怪问题。在我的mac和OSX上,这很好,但一旦我把它转到运行Ubuntu的桌面上,我就面临着问题 基本上,我所做的是: Function() { for(i = 1 to 10) while(array not completely changed) { pthread_mutex_lock(&lock); -- perform actions pthread_mutex_unlock(&
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
}
你正在经历“饥饿”。偶尔添加一个小的nanosleep
调用,让其他线程有机会运行。在互斥对之外添加调用(例如,在解锁之后)。线程1是独占的东西
你也可以考虑重组和拆分关键的(需要锁定)与非关键性工作:
while (more) {
lock ...
do critical stuff ...
unlock ...
nanosleep ...
do non-critical stuff
}
您感兴趣的是线程调度程序。看看这个。从3.14版开始,Linux提供了一个截止日期调度策略(SCHED_deadline)。您可能对循环策略感兴趣。注意,我们在当前的C++标准中有<代码> STD::线程< /代码>类,它应该比
nanosleep
放在我的代码中的什么位置?在锁被释放后,但在重新获得它之前。将第一个线程置于休眠状态将允许第二个线程有时间获取锁等。在释放锁后但重新获取锁之前,我将在代码中放置此nanosleep
。将第一个线程置于睡眠状态将允许第二个线程有时间获取锁等。