Member 14016042 Ответов: 4

'Mutex' undeclared (первое использование в этой функции)


Я хочу создать программу, которая получает число N в качестве аргумента и запускает N потоков, каждый из которых синхронно отображает одно из чисел от 1 до N, чтобы создать упорядоченную последовательность (12 ... N) *. где необходимо использовать одну и ту же функцию, выполняемую всеми потоками, и передать число, которое будет отображаться в качестве аргумента при запуске потока. Вот мой код :

#include<stdlib.h>
#include<pthread.h>
#include<sys/types.h>
#include<unistd.h>
//#include <pthread.h>   // pour les threads
#include <semaphore.h> // pour les semaphores
#include <fcntl.h>     // pour les flags O_CREAT, O_EXCL, ...


// Discussion : perte de cycles
// $ gcc -Wall synchro-valeur.c -lpthread
int N;
//sem_t mutex[10];
void* f0(int j) {

    for(int i = 0; i < 100; i++) {

        if(j < N-1){

            //printf("sdfsfsfsdsds: %d\n",j);

            sem_wait(&mutex[j]);
            //puts("lol");
            char k = (char)(j+1);
            puts(k+"\n");
            sem_post(&mutex[j+1]);
        }
        else{
            sem_wait(& mutex[N-1]);
            char k = (char)N;
            puts(k+"\n");
            sem_post(&mutex[0]);
        }



    }
    return NULL;
}



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

    N = atoi(argv[1]);

    sem_t mutex[N];



    unsigned int value[N];

    /*value[0]=1;

    for(int i =1;i<N;i++){
        value[i] = 0;
    }
    */

    sem_init(&mutex[0],0,1);
    for(int i =1;i<N;i++){
        sem_init(&mutex[i],0,0);
    }
    pthread_t pid[N];

    for (int j=0;j<N;j++){

        pthread_create(&pid[j],NULL,f0(j),NULL);

    }
    //puts("heyG");
    for (int i=0;i<N;i++){
        pthread_join(pid[i],0);
    }
    //puts("heyH");
    for (int i=0;i<N;i++){
        sem_destroy(&mutex[i]);
    }
    //puts("heyN");
    return EXIT_SUCCESS;
    //return 0;
}


Я не знаю, как устранить эту ошибку
ошибка: ‘mutex’ undeclared (первое использование в этой функции) sem_wait(&mutex[j]);

Что я уже пробовал:

Пожалуйста, кто-нибудь может помочь мне исправить эту ошибку
спасибо

4 Ответов

Рейтинг:
1

CHill60

Если код, который вы опубликовали в качестве решения, действительно является кодом, вызывающим ошибку, попробуйте изменить его

sem_wait(& mutex[N-1]);
к
sem_wait(&mutex[N-1]);


Member 14016044

У меня все еще есть ошибка

CHill60

И ошибка все еще "‘mutex’ undeclared (первое использование в этой функции) sem_wait(&mutex[j]);"?
Вы действительно пробовали предложения @OriginalGriff?

Member 14016042

О, я этого не видел ! Спасибо

Рейтинг:
0

OriginalGriff

mutex объявляется как часть вашего main функция:

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

    N = atoi(argv[1]);

    sem_t mutex[N];
что делает ее локальной переменной - ее область действия ограничена набором фигурных скобок, которые совсем недавно заключили ее в себя - main сама функция.
И тогда вы пытаетесь использовать его в пределах f0 функция:
void* f0(int j) {

    for(int i = 0; i < 100; i++) {

        if(j < N-1){

            //printf("sdfsfsfsdsds: %d\n",j);

            sem_wait(&mutex[j]);
Поскольку ни одна глобальная или локальная переменная не существует в f0 функция, справедливо сетует система.

Возможно, вы хотите сделать mutex либо глобальный (объявив его вне тела любой функции), либо передайте его в качестве параметра в f0 функция наряду с j


Member 14016044

Этот код дает мне ошибку, которую я опубликовал выше

OriginalGriff

Да. И так будет продолжаться до тех пор, пока вы не прочтете то, что я сказал, и не исправите это...

Рейтинг:
0

KarstenK

Действительно странно, что первая ошибка находится на этой линии. Компилятор должен жаловаться уже на:

sem_t mutex[N];
Этот код должен делать эту работу
sem_t *mutex = malloc( sizeof( sem_t ) * N );
//at the ende
free( mutex );
Совет: установите уровень предупреждения выше. Эти предупреждения помогают вам писать хороший код :-)


Member 14016044

Я сделал то, что ты сказал.
но у меня была такая ошибка

ошибка: элемент инициализатора не является постоянным
sem_t *mutex = malloc( sizeof( sem_t ) * N );

KarstenK

Я думаю, что вы должны написать sem_t *mutex; в начале функции, потому что C нуждается во всех vars в начале.

Рейтинг:
0

Member 14016042

Извините, что скопировал не тот код.

#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
#include<sys/types.h>
#include<unistd.h>
//#include <pthread.h>   // pour les threads
#include <semaphore.h> // pour les semaphores
#include <fcntl.h>     // pour les flags O_CREAT, O_EXCL, ...


// Discussion : perte de cycles
// $ gcc -Wall synchro-valeur.c -lpthread
int N;
sem_t mutex[N];
void* f0(int j) {
	//sem_t mutex[N];
    for(int i = 0; i < 100; i++) {
    	
    	if(j < N-1){
    		
    		//printf("sdfsfsfsdsds: %d\n",j);
    		
    		//sem_wait(&mutex[j]);
    		//puts("lol");
    		char k = (char)(j+1);
    		puts(k+"\n");
    		sem_post(&mutex[j+1]);
    	}
    	else{
    		sem_wait(& mutex[N-1]);
    		char k = (char)N;
    		puts(k+"\n");
    		sem_post(&mutex[0]);
    	}
    	
 

    }
    return NULL;
}



int main(int argc, char *argv[]) {
	
	N = atoi(argv[1]);
	
//	sem_t mutex[N];
	
	
	
	//unsigned int value[N];
	
	/*value[0]=1;

	for(int i =1;i<N;i++){
		value[i] = 0;
	}
	*/

	sem_init(&mutex[0],0,1);
	for(int i =1;i<N;i++){
		sem_init(&mutex[i],0,0);
	}
	pthread_t pid[N];
	
	for (int j=0;j<N;j++){
		
		pthread_create(&pid[j],NULL,f0(j),NULL);
		
	}
	//puts("heyG");
	for (int i=0;i<N;i++){
		pthread_join(pid[i],0);
	}
	//puts("heyH");
	for (int i=0;i<N;i++){
		sem_destroy(&mutex[i]);
	}
	//puts("heyN");
	return EXIT_SUCCESS;
    //return 0;
}


CHill60

Если вам нужно улучшить свой вопрос, используйте ссылку "улучшить вопрос" рядом с ним. Если он не виден, наведите курсор мыши на исходный пост, и он должен появиться.

Richard Deeming

Если это было опубликовано OP, то он создал учетную запись sock-puppet, чтобы опубликовать ее - это две разные учетные записи.

Richard MacCutchan

Средний плакат QA - не совсем такой яркий, как лампа Toc-H.

CHill60

Имена пользователей не показывались, когда я смотрел на это, только сейчас понял. Тот, за кем нужно присматривать!