Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 线程1和线程2在我实现Lamport';s烘焙算法_C_Multithreading_Concurrency_Synchronization_Pthreads - Fatal编程技术网

C 线程1和线程2在我实现Lamport';s烘焙算法

C 线程1和线程2在我实现Lamport';s烘焙算法,c,multithreading,concurrency,synchronization,pthreads,C,Multithreading,Concurrency,Synchronization,Pthreads,我正在实施 我的输出显示线程1和线程2比其他线程具有更高的优先级。我的实现如下 #包括(pthread.h) #包括(stdio.h> #包括(unistd.h> #包括(assert.h> volatile int NUM_线程=10; 易失性整数[10]={0}; 易失性整数计数_cs[10]={0}; volatile int输入[10]={0}; int max() { int i=0; int j=0; int maxvalue=0; 对于(i=0;imaxvalue) { 最大值=数

我正在实施

我的输出显示线程1和线程2比其他线程具有更高的优先级。我的实现如下

#包括(pthread.h)
#包括(stdio.h>
#包括(unistd.h>
#包括(assert.h>
volatile int NUM_线程=10;
易失性整数[10]={0};
易失性整数计数_cs[10]={0};
volatile int输入[10]={0};
int max()
{
int i=0;
int j=0;
int maxvalue=0;
对于(i=0;i<10;i++)
{
如果((编号[i])>maxvalue)
{
最大值=数量[i];
}
}
返回最大值;
}
锁(内部i)
{
int j;
输入[i]=1;
数量[i]=1+max();
输入[i]=0;

对于(j=1;j而言,这有几个问题

首先,
pthread\u create
需要很多时间:当然比快速锁定/增量计数/解锁迭代要多得多。因此,第一个线程比其他线程有很大的优势,因为它首先运行,第二个线程的优势更小,以此类推。当你将
printf
粘贴到循环中时,这会减慢线程的运行速度d下降,因此优势较小

在相关注释中,仅仅因为<代码> pthRead创建> /代码>已经返回,线程不一定已经启动。它只是意味着调度器现在将考虑它。

第三,您的锁实现是一个繁忙的等待循环。因此,无论哪个线程正在运行,它都将占用所有可用的CPU时间。因为您在单个内核上运行代码,如果拥有锁的线程被挂起,那么其他线程将花费所有的时间片进行繁忙的等待,然后带锁的线程可以继续运行继续,解锁,然后再次尝试锁定

最后,在锁上发生争用的情况下,该算法将优先权给予数量最少的线程,因此线程0将比其他线程更多地获得锁,因为所有线程都在忙等待,因此存在高争用


尝试在
lock()
中的循环中放置一些
sched_yield()
调用,以使带有锁的线程有更多的机会运行。

我看到您在单个CPU上运行,因此可以避免以下问题。不过,请记住这一点

请注意,与Microsoft的编译器不同,GCC没有为
volatile
赋予特殊的非标准SMP线程含义。因此,您不能依赖它在CPU之间进行排序。这意味着,如果
Number
Entering
在不同的缓存线上,CPU-0可以自由地写入
Number
输入的
在CPU-1上的显示顺序与您认为的不同

要解决这个问题,您需要使用原子操作。GCC为这些操作提供了内置功能