如何在n个进程的c中创建关键部分的代码(Bakery算法)

时间:2017-04-15 05:57:25

标签: c linux multithreading algorithm pthreads

我的大学有一个关于n个过程的关键部分问题的项目。我已经为c中的2个进程编写了代码但是我无法弄清楚如何让它在n进程中运行。代码在C语言中用于linux线程。

以下是2个进程的代码。

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>

int flag[2];
int turn;
const int MAX = 1e9;
int ans = 0;


void lock_init(){
    flag[0]=flag[1]=0;
    turn = 0;
}

void lock(int self){
    flag[self]=1;
    turn = 1-self;

    while(flag[1-self]==1 && turn == 1-self);
}

void unlock(int self){
    flag[self]=0;
}

void* func(void *s){
    int i=0;
    int *limitptr = (int*) s;
    int self = *limitptr;
    printf("Thread %d in queue for critical section\n",self);

    lock(self);

    printf("Thread %d in critical section\n",self);
    for(i=0;i<MAX;i++){

        ans++;

    }
     printf("Thread %d done counting\n",self);
    printf("Thread %d is exiting critical section\n",self);
    unlock(self);
}

int main(){

    pthread_t p1, p2;
    int a=0,b=1;
    lock_init();

    pthread_create(&p1, NULL, func, &a);
    pthread_create(&p2, NULL, func, &b);

    pthread_join(p1, NULL);
    pthread_join(p2, NULL);

    printf("Exiting Main\n");
    return 0;
}

任何帮助将不胜感激。 谢谢。 :)

2 个答案:

答案 0 :(得分:0)

使用mutex

#include <pthread.h>

像这样声明互斥:

pthread_mutex_t myMutex = PTHREAD_MUTEX_INITIALIZER;

然后在关键部分调用的开头:

pthread_mutex_lock( &myMutex );

并在关键部分结束时致电:

pthread_mutex_unlock( &myMutex );

使用该关键部分的线程数无关紧要,一次只能有一个线程访问它

答案 1 :(得分:-1)

感谢您宝贵的时间和答案。 我找到了解决我的问题的方法,并考虑分享它。我在C中实现了面包店算法。

$output

再次感谢你:)