0

当我从 main 中的线程创建调用它时,我的 request_resources 方法没有运行。它应该是创建一个线程、请求资源、检查安全状态然后退出。我不确定为什么它在 2 个线程后停止并且没有从方法中的测试语句中给出任何输出。

        #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");

}
4

1 回答 1

2

调用的线程函数的正确声明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().

于 2017-03-23T15:37:48.577 回答