При создании потока алгоритма Bankers не выполняется пройденный метод полностью

Мой метод request_resources не запускается, когда я вызываю его из потока создания в моей главной. Это должно быть создание потока, запрос ресурсов, проверка безопасного состояния и затем выход. Я не уверен, почему он останавливается после 2-х потоков и не дает вывода из операторов test в методах.

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


/* these may be any values >= 0 */

#define NUMBER_OF_CUSTOMERS 5
#define NUMBER_OF_RESOURCES 3

/* the available amount of each resource */
int available[NUMBER_OF_RESOURCES];

/*the maximum demand of each customer */
int maximum[NUMBER_OF_CUSTOMERS][NUMBER_OF_RESOURCES];

/* the amount currently allocated to each customer */
int allocation[NUMBER_OF_CUSTOMERS][NUMBER_OF_RESOURCES];

/* the remaining need of each customer */
int need[NUMBER_OF_CUSTOMERS][NUMBER_OF_RESOURCES];

pthread_mutex_t mutex =
PTHREAD_MUTEX_INITIALIZER;

    int safe_state(int customer_num){
        int work[NUMBER_OF_CUSTOMERS];
        int done;
        for(int w = 0; w < NUMBER_OF_CUSTOMERS; w++){
            work[w] = available[w];
            printf("%d", work[w]);
        }

        int finish[NUMBER_OF_CUSTOMERS];

        for(int i = 0; i < NUMBER_OF_CUSTOMERS; i++){
            finish[i] = 0;
        }

        for(int k = 0; k < NUMBER_OF_CUSTOMERS; k++){
            if(finish[k] == 0 && need[customer_num][k] <= work[k]){
                work[k] += allocation[customer_num][k];
                finish[k] = 1;
            }
            else{
                done = -1;
                break;
            }
        }

        for(int x = 0; x < NUMBER_OF_CUSTOMERS; x++){
            if(finish[x] == 0){
                done = 1;
            }
            else{
                done = -1;
            }
        }
        printf("\n jj %d", done);

        return done;

    }


    int* request_resources(int customer_num, int request[]){
        pthread_mutex_lock(&mutex);
        int pass = 2;
        for(int i = 0; i < NUMBER_OF_RESOURCES; i++){
            if(request[i] <= need[customer_num][i] && request[i] <= available[i]){
                printf("Sata"); 
                int state = safe_state(customer_num);
                if(state == 1){
                    available[i] -+ request[i];
                    allocation[customer_num][i] += request[i];
                    need[customer_num][i] -+ request[i];
                    pass = 1;

                }
                else{
                    printf("This results in unsafe state\n");
                    pass = -1;
                    break;
                }
            }
            else{
                printf("Not enough resources\n");
                pass = -1;
                break;
            }
        }
        printf("I'm a thread\n");
        pthread_mutex_unlock(&mutex);
        return pass;

    } 

    int release_resources(int customer_num, int release[]){

    }




int main(int argc, char *argv[]){



    pthread_t threads [NUMBER_OF_CUSTOMERS];
    int result;
    unsigned index = 0;

    for(index = 0; index < NUMBER_OF_RESOURCES; index++){
        available[index] = strtol(argv[index+1], NULL,10);
    }   

    int req[] = {1,2,3};
    for(index = 0; index < NUMBER_OF_CUSTOMERS; ++index){
        printf("\nCreating thead %d\n", index);
        result = pthread_create(&threads[index],NULL,request_resources,req);    

    }





   printf("\nDone");

}

1 ответ

Решение

Правильное объявление для функции потока, вызываемой pthread_create() является

void *start_routine( void *arg );

согласно документации POSIX:

СИНТАКСИС

#include <pthread.h>

int pthread_create(pthread_t *restrict thread,
       const pthread_attr_t *restrict attr,
       void *(*start_routine)(void*), void *restrict arg);

Ваш код:

    result = pthread_create(&threads[index],NULL,request_resources,req);    

звонки request_resources() чтобы начать каждый поток. Но request_resources() определяется как

int* request_resources(int customer_num, int request[]){
   ...
}

Это не void *start_routine( void *arg ) как указано.

Вы вызываете неопределенное поведение.

Кроме того, весь ваш процесс, включая каждый поток, который он создает main() возвращается. Вам нужно дождаться окончания каждого потока pthread_join(),

Другие вопросы по тегам