2014-02-24 43 views
0

我试图模拟一个多线程环境,每个线程调用Kevin类的Speak函数。但是,pthread_mutex_lock函数存在分段错误(之后/期间),我找不到原因。 pthread_mutex_lock之后的行永远不会执行。有人说这可能是pthread_mutex_t的声明问题,但是我在全局声明了包含声明之后才声明它。 编辑:它的使用在RedHat Linux 64位运行gcc版本4.1.2pthread_mutex_lock上的核心转储

#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); 
} 

与第一参数(螺纹数)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试图解引用一些无效地址的地方。 – anonymous

+0

很好的发现。我遵循教程。但是,链接中的示例使用与我一样的语句,并且没有核心转储,您知道为什么吗? https://computing.llnl.gov/tutorials/pthreads/samples/dotprod_mutex.c –

+0

本示例使用“arg”作为变量,其语句为:'offset =(long)arg',但将其用作变量指针:'*((int *)value)'。 – Charlie

回答

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没有互斥锁