#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
в параметры компиляции.