основной дамп на pthread_mutex_lock

0

Я пытаюсь имитировать многопоточную среду, причем каждый поток вызывает функцию 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)
  • 3
    pthread_create (& callThd [i], & attr, Kevin :: Speak, (void *) i); Я не указатель, и на самом деле, вы пытаетесь получить доступ от i = 0 до i = 7 в качестве указателя, и это неверный адрес. Я думаю, что именно здесь segfaults пытается разыменовать какой-то неверный адрес.
  • 0
    хорошая находка. Я следовал за учебником. Тем не менее, пример в ссылке использует тот же оператор, что и я, и не содержит дамп ядра, знаете почему? computing.llnl.gov/tutorials/pthreads/samples/dotprod_mutex.c
Показать ещё 1 комментарий
Теги:
multithreading
mutex
pthreads

2 ответа

1
Лучший ответ

Это не вызов мьютекса, после этого он является 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);
}
1
pthread_create(&callThd[i], &attr, Kevin::Speak, (void *)&i) // should be variable pointer
cout << "Name: Kevin" << *((long*)value) ... // int => long

Не повезло, даже так изменилось, эта программа по-прежнему неправа. Потому как:

Переменная i является общей для всех говорящих потоков и основного потока, но основной поток использует i без блокировки мьютекса.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню