Многопоточная ошибка

#c #multithreading

#c #многопоточность

Вопрос:

Я ввел следующий код в CodeLite (Linux), и он выдал мне ошибку ниже:

:18:62: ошибка: недопустимое преобразование из ‘void * () ()’ в ‘void () (void)’ [-fpermissive]

//КОД ЗДЕСЬ///

 #include <stdio.h>
#include <pthread.h>
#include <iostream>
#include <stdlib.h>
using namespace std;

    void *functionC();
    pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
    int  counter = 0;

    main()
    {
       int rc1, rc2;
       pthread_t thread1, thread2;

       /* Create independent threads each of which will execute functionC */

       if( (rc1=pthread_create( amp;thread1, NULL, amp;functionC, NULL)) )
       {
          printf("Thread creation failed: %dn", rc1);
       }

       if( (rc2=pthread_create( amp;thread2, NULL, amp;functionC, NULL)) )
       {
          printf("Thread creation failed: %dn", rc2);
       }

       /* Wait till threads are complete before main continues. Unless we  */
       /* wait we run the risk of executing an exit which will terminate   */
       /* the process and all threads before the threads have completed.   */

       pthread_join( thread1, NULL);
       pthread_join( thread2, NULL);

       exit(0);
    }

    void *functionC()
    {
       pthread_mutex_lock( amp;mutex1 );
       counter  ;
       printf("Counter value: %dn",counter);
       pthread_mutex_unlock( amp;mutex1 );
    }
 

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

Спасибо за ваши ответы и комментарии

Ответ №1:

У вас несоответствие типов. pthread_create ожидает указатель на функцию типа void *(*func_name)(void*) . Но вы дали ему void *functionC() оценку, а это не одно и то же.

Измените свою функцию на эту:

 void* functionC(void*)
{
   pthread_mutex_lock( amp;mutex1 );
   counter  ;
   printf("Counter value: %dn",counter);
   pthread_mutex_unlock( amp;mutex1 );

   return NULL;
}
 

И вам также нужно будет изменить свой прототип:

 void* functionC(void*);
 

Комментарии:

1. Да, его объявление прототипа неверно, кстати, вероятно, следует упомянуть об этом.

2. В чем заключается ошибка? Кроме того, избавьтесь от amp; из вашего amp;functionC . Так что просто используйте functionC . (Я не уверен, что это ошибка.)

3. Это странно. Вы определенно включены <pthread.h> . Просто он жалуется на какие-либо другие функции pthread?

4. да, он также выдает эту ошибку: неопределенная ссылка на `pthread_create'

5. Ох... Это ошибка компоновщика. Добавить -lpthread в параметры компиляции.