【发布时间】:2022-01-05 20:48:04
【问题描述】:
最近我学习了一门操作系统课程,该课程将我从信号量的小书中发送到屏障伪代码。但是现在几个小时我一直在努力实现这个障碍,我似乎无法正确理解它。为了理解它,我尝试了一个简单的程序,让线程进入障碍,当所有线程都到达时,让它们通过。 这是我的代码:
#include <errno.h>
#include <string.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <semaphore.h>
#define NR_MAX 5
int n=NR_MAX;
int entered = 0;
pthread_mutex_t mtx;
sem_t smph;
void* bariera(void *v){
pthread_mutex_lock(&mtx);
entered++ ;
printf("thread %d have entered\n", entered);
pthread_mutex_unlock(&mtx);
if(entered == n) {
sem_post(&smph); printf("Out %d \n", entered);}
sem_wait(&smph);
sem_post(&smph);
}
int main() {
pthread_t thr[NR_MAX];
pthread_mutex_init(&mtx, NULL);
sem_init(&smph, 0, 1);
for (int i=0; i<NR_MAX; i ){
pthread_create(&thr[i], NULL, bariera, NULL);
}
for(int i=0; i<NR_MAX; i ){
pthread_join(thr[i], NULL);
}
return 0;
}
这应该如何实际实施?因为现在,它只打印他们到达障碍物的顺序,然后只打印最后一个到达的顺序。
编辑:完全忘记了,这是伪代码:
n = the number of threads
count = 0 - keeps track of how many threads arrived at the barrier
mutex = Semaphore (1) - provides exclusive acces to count
barrier = Semaphore (0) - barrier is locked (zero or negative) until all threads arrive; then it should be unlocked(1 or more)
rendezvous
2
3 mutex.wait()
4 count = count + 1
5 mutex.signal ()
6
7 if count == n: barrier.signal ()
8
9 barrier.wait()
10 barrier.signal ()
11
12 critical point
预期输出:
Out 5
Out 4
Out 3
Out 2
Out 1
(顺序不必相同)
实际输出:
Out 5
【问题讨论】:
-
“信号量小书中的屏障伪代码”。不能指望每个人都读过或拥有这本书的副本。请在问题本身中给出伪代码。还要给出确切的预期输出与实际输出。
-
伪代码看起来有竞争条件。
count = count + 1是安全的 [mutex protected] 但它与if count == n[refetchescount但未 mutex锁定]竞争。你为什么不[只是]使用pthread_barrier_init/pthread_barrier_wait?或者,如果您尝试重新发明/重新实现它们,请查看它们的源代码以获取干净/调试的 impl。 -
我有一个任务,为了更好地理解信号量,我必须实现这个类似屏障的伪代码。另外,我不认为比赛条件现在是一个问题,因为我想要的只是打印一些东西,正如我所说,顺序并不重要
-
也许你的程序应该在线程通过障碍后做一些事情,这样你就可以看到它是否在工作?
-
不,比赛会阻止它正常工作。只需:
temp = ++count;然后if (n == temp)。如果您想了解信号量/障碍,那么您应该想要了解竞争条件。
标签: c pthreads semaphore barrier