我试图模拟一个多线程环境,每个线程调用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)
pthread_create(&callThd [i],&attr,Kevin :: Speak,(void *)i);我不是一个指针,事实上,你试图访问i = 0到i = 7作为指针,这是一个无效的地址。我认为这是segfaults试图解引用一些无效地址的地方。 – anonymous
很好的发现。我遵循教程。但是,链接中的示例使用与我一样的语句,并且没有核心转储,您知道为什么吗? https://computing.llnl.gov/tutorials/pthreads/samples/dotprod_mutex.c –
本示例使用“arg”作为变量,其语句为:'offset =(long)arg',但将其用作变量指针:'*((int *)value)'。 – Charlie