Я пытаюсь имитировать многопоточную среду, причем каждый поток вызывает функцию Speak класса Kevin. Однако существует ошибка сегментации (после/во время) функции pthread_mutex_lock, и я не мог понять, почему. Строка после pthread_mutex_lock никогда не будет выполнена. Некоторые говорят, что это может быть проблема объявления pthread_mutex_t, но я получил это глобальное объявление сразу после моих операторов include. EDIT: он работает на redhat linux 64bit с использованием gcc версии 4.1.2
#include <iostream>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
pthread_mutex_t mutexsum;
class Kevin
{
public:
Kevin();
static void* Speak(void* value);
};
Kevin::Kevin()
{
cout << "new instance of Kevin is created\n";
}
void* Kevin::Speak(void* value)
{
cout<<"before lock"<<endl;
pthread_mutex_lock (&mutexsum);
cout << "Name: Kevin" << *((int*)value) << "\n" << "Seconds since epoch:" << "\nThread id:" << pthread_self() << endl;
pthread_mutex_unlock (&mutexsum);
}
int main (int argc, char *argv[])
{
cout << "HI1" << endl;
int threadsNumb = atoi(argv[1]);
pthread_t callThd[threadsNumb];
long i;
void *status;
pthread_attr_t attr;
/* Assign storage and initialize values */
pthread_mutex_init(&mutexsum, NULL);
cout << "HI2" << endl;
/* Create threads to perform the dotproduct */
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
cout << "HI3" << endl;
for(i=0;i<threadsNumb;i++)
{
cout << "HI4" << endl;
pthread_create(&callThd[i], &attr, Kevin::Speak, (void *)i);
}
cout <<"HI6"<<endl;
pthread_attr_destroy(&attr);
/* Wait on the other threads */
cout <<"HI7"<<endl;
for(i=0;i<threadsNumb;i++) {
cout <<"HI8"<<endl;
pthread_join(callThd[i], NULL);
cout <<"HI9"<<endl;
}
pthread_mutex_destroy(&mutexsum);
pthread_exit(NULL);
}
Образцы выходов с 1-м аргументом (номер резьбы) 8:
$ ./a.out 8
HI1
HI2
HI3
HI4
HI4
HI4
HI4
HI4
HI4
HI4
HI4
before lock
before lock
before lockbefore lock
before lock
before lock
Segmentation fault (core dumped)
$ ./a.out 8
HI1
HI2
HI3
HI4
HI4
HI4
HI4
HI4
HI4
HI4
HI4
HI6
HI7
HI8
before lock
Segmentation fault (core dumped)
Это не вызов мьютекса, после этого он является cout. Вы ссылаетесь на значение, как на указатель, в то время как оно на самом деле длинное. Попробуйте следующие изменения:
void* Kevin::Speak(void* value)
{
long i = (long) value; // cast from pointer to long
cout<<"before lock"<<endl;
pthread_mutex_lock (&mutexsum);
cout << "Name: Kevin" << i << "\n" << "Seconds since epoch:" << "\nThread id:" << pthread_self() << endl;
pthread_mutex_unlock (&mutexsum);
}
pthread_create(&callThd[i], &attr, Kevin::Speak, (void *)&i) // should be variable pointer
cout << "Name: Kevin" << *((long*)value) ... // int => long
Не повезло, даже так изменилось, эта программа по-прежнему неправа. Потому как:
Переменная i
является общей для всех говорящих потоков и основного потока, но основной поток использует i
без блокировки мьютекса.