Member 14016042 Ответов: 1

Как исправить это предупреждение


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

int N;
void* f0(int k, sem_t *mutex) {
	
    for(int i = 0; i < 100; i++) {
    	if(k < N-1){
    		sem_wait(&mutex[k]);
    		//printf("value[] = %d", value[k]);
    		printf("%d\n",k+1);
    		k = k + 1;
    		sem_post(&mutex[k]);
    		//printf("i =%d \n",i);
    		

    	}
    	
    	else{
    		
    		sem_wait(&mutex[N-1]);
    		printf("%d\n",k+1);
    		k = N-k-1;
    		sem_post(&mutex[k]);
    		//printf("i =%d \n",i);
    		

    	}
    }
    
    return NULL;
}
int main(int argc, char *argv[]) {
	N = atoi(argv[1]);
	int *value;
	value= malloc(sizeof(int)*N);
	sem_t *mutex;
	mutex =malloc(sizeof(sem_t)*N);
	pthread_t pid[N];
	
	for (int i =0;i<N;i++){
		if(i==0){
			value[i]=1;
		}
		else{
			value[i]=0;
		}
	}
	for(int i=0;i<N;i++){
		sem_init(&mutex[i],0,value[i]);
	}
	int m =0;
	while(m<N){
        pthread_create(&pid[m], NULL, f0(m,&mutex),0);
        m=m+1;
        printf("m = %d\n", m );
        
	}
	printf("heyG\n");
	for (int i=0;i<N;i++){
		pthread_join(pid[i],0);
	}
	for (int i=0;i<N;i++){
		sem_destroy(&mutex[i]);
	}
	return EXIT_SUCCESS;
}


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

Я получаю это предупреждение и хочу его исправить

copie.c: In function ‘main’:
copie.c:60:44: warning: passing argument 2 of ‘f0’ from incompatible pointer type [-Wincompatible-pointer-types]
         pthread_create(&pid[m], NULL, f0(m,&mutex),0);
                                            ^
copie.c:11:7: note: expected ‘sem_t * {aka union <anonymous> *}’ but argument is of type ‘sem_t ** {aka union <anonymous> **}’
 void* f0(int k, sem_t *mutex) {

1 Ответов

Рейтинг:
0

Rick York

Попробуй

pthread_create( &pid[m], NULL, f0, 0 );
При передаче указателя на функцию аргументы не включаются.


Member 14016042

copie.c: в функции ‘main’:
copie.c:61:39: warning: передача аргумента 3 ‘pthread_create’ из несовместимого типа указателя [-Wincompatible-pointer-types]
pthread_create(&pid[m], NULL, f0,0);
^
В файле, включенном из copie.c:3:0:
в /usr/включать/pthread в.ч:233:12: Примечание: ожидается ‘пустоту * (*)(недействительными *)’, но аргумент имеет тип ‘void*, который (*)(инт sem_t *) {ака недействительным * (*)(инт Союз &ЛТ;аноним> У *)}’
extern int pthread_create (pthread_t *__restrict __newthread,
это дает мне такое предупреждение

Rick York

Вот прототип этой функции:

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg );
Я нахожу typedefs полезным в таких ситуациях.
typedef void * pvoid;
typedef pvoid (* threadfunc)( pvoid );
Ваша функция, f0, не соответствует этому прототипу, поэтому вы должны изменить его, пока он не сделает. Вы можете определить структуру, содержащую элементы данных, которые вы хотите передать, если хотите. Я делал это в прошлом, и это работает. Для вас членами этой структуры будут целое число и указатель на sem_t.

Member 14016042

Вот что я сделал
структура элемента данных
{
текст;
sem_t *мьютекс;
};

пустота* ф0(структуры данных dataitem ) {

for(int i = 0; i < 100; i++) {
if(data.k < N-1){
sem_wait(&ампер;(данные.мьютекс)[сведения.к]);
//sem_wait(&ампер;мьютекс[к]);
printf("%d\n",data.k + 1);
//k = k + 1;
//sem_post(&mutex[k+1] );
sem_post(&(data.mutex)[data.k + 1]);
//printf("i =%d \n",i);


}

еще{

//sem_wait(&ампер;мьютекс[к]);
sem_wait(&ампер;(данные.мьютекс)[сведения.к]);

printf("%d\n",data.k + 1);
//k = N-k-1;
//sem_post(&mutex[N-k-1]);
sem_post(&ампер;(данные.мьютекс)[N - data.k - 1]);
//printf("i =%d \n",i);


}
}

возвращать null;
}
и в основной функции :
а(м&ЛТ;П){
данные структуры элемента данных ;
данных.к = м;
данных.мьютекс = &ампер;мьютекс;
pthread_create(&pid[m], NULL, f0(data),0);
m=m+1;
printf("m = %d\n", m );

}

Member 14016042

и я получаю это предупреждение

украинском языке.с:73:14: предупреждение: назначение от несовместимых типа указателя [-Wincompatible-указателя-типы]
данных.мьютекс = &ампер;мьютекс;

Rick York

Если мьютекс объявлен и используется как и раньше, я бы предположил, что это должно быть Скрыть   скопировать код

data.mutex = &mutex[m];
Кроме того, я думаю, что это должно быть так:
pthread_create( &pid[n], NULL, f0, &data[m] );
данные - это аргумент в функции создания потока. Вероятно, вы не хотите делиться одним экземпляром данных со всеми потоками, поэтому создайте массив структур, установите каждую из них соответствующим образом и передайте адрес этой структуры потоку.
DataItem * data = (DataItem *)calloc( sizeof( DataItem ), N );
while( m < N )
{
   data[m].k = m;
   data[m].mutex = &mutex[m];
   pthread_create( &pid[m], NULL, f0, &data[m] );
   ++m;
   printf("m = %d\n", m );
}