gpt4 book ai didi

c++ - pthread_mutex_lock 上的核心转储

转载 作者:行者123 更新时间:2023-11-28 02:56:02 27 4
gpt4 key购买 nike

我正在尝试模拟一个多线程环境,每个线程都调用 Kevin 类的 Speak 函数。但是,在 pthread_mutex_lock 函数(之后/期间)存在段错误,我找不到原因。 pthread_mutex_lock 之后的行永远不会执行。有人说这可能是 pthread_mutex_t 的声明问题,但我在我的 include 语句之后就全局声明了它。编辑:它使用 gcc 版本 4.1.2 在 redhat linux 64 位上运行

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

最佳答案

这不是互斥锁调用,是之后的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);
}

关于c++ - pthread_mutex_lock 上的核心转储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21977875/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com