Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Pthread#u create导致C+中的分段错误+;_C++_Pthreads_Coredump - Fatal编程技术网

C++ Pthread#u create导致C+中的分段错误+;

C++ Pthread#u create导致C+中的分段错误+;,c++,pthreads,coredump,C++,Pthreads,Coredump,我试图接受一个整数值,并在程序中创建那个数量的线程。奇怪的是,只能创建第一个线程。经过一些跟踪,它显示pthread_create是导致核心转储的行 #include <iostream> #include <time.h> #include <pthread.h> using namespace std; class Kevin { public: Kevin(); static void* Speak(void* value); };

我试图接受一个整数值,并在程序中创建那个数量的线程。奇怪的是,只能创建第一个线程。经过一些跟踪,它显示pthread_create是导致核心转储的行

#include <iostream>
#include <time.h>
#include <pthread.h>
using namespace std;

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 << "Name: Kevin" << *((int*)value) << "\n" << "Seconds since epoch:" << "\nThread id:" << pthread_self() << endl;
}

int main(int argc, char *argv[])
{
    int threadsNumb = atoi(argv[1]);
    cout << "number of threads :" << threadsNumb <<endl;
    int status;
    int i;
    pthread_t threads[threadsNumb];
    for(i=0;i<threadsNumb;i++)
    {
        cout << "what is i? " << i << endl;
        cout << &threads[i] << i << endl;
        cout << "threads" << threads[i] << endl;
        cout << "thread Numb" << threadsNumb << endl;

        pthread_create(&(threads[i]),NULL,Kevin::Speak,(void *)&i); // this line
        pthread_join(threads[i], (void **)&status);
        cout << endl;
    }
    return EXIT_SUCCESS;
}
我尝试移动
pthread_t threads[threadsNumb]的声明进入for循环,它可以运行,但它会给我所有相同的线程id,这是不需要的。知道内核转储的原因吗?我花了几个小时才解决了这个小问题。
我也研究了一个类似的问题,但我没有重新声明任何内容:

这是将pthread join的第二个参数更改为NULL后得到的结果

what is i? 0
0x7fffe23e12f00
threads6296496
thread Numb3
Name: Kevin0
Seconds since epoch:
Thread id:1098664256

what is i? 1
0x7fffe23e12f81
threads242525729787
thread Numb3
Name: Kevin1
Seconds since epoch:
Thread id:1098664256

what is i? 2
0x7fffe23e13002
threads47489276644304
thread Numb3
Name: Kevin2
Seconds since epoch:
Thread id:1098664256

为什么线程id相同?

一个可能的原因可能是您在一台64位机器上,
int
是32位,但指针是64位。这意味着您的
pthread\u join
调用将在为变量
status
分配的空间之外写入。变量
i
被覆盖的可能性不大(在第二个循环中打印的地址与第一个地址相差很大)


在您的情况下,如果您实际上没有从线程函数返回任何内容,那么您最好将
pthread\u join
的第二个参数传递
NULL
,一个可能的原因可能是您在一台64位机器上,
int
是32位,但指针是64位。这意味着您的
pthread\u join
调用将在为变量
status
分配的空间之外写入。变量
i
被覆盖的可能性不大(在第二个循环中打印的地址与第一个地址相差很大)


在您的情况下,如果您实际上没有从线程函数返回任何内容,那么您最好将
NULL
传递给
pthread\u join

的第二个参数,您不应该将
&i
传递给线程,它可能会在线程访问它之前增加。这肯定是一场竞赛。@HAL因为OP在
pthread\u create
之后直接调用
pthread\u join
,这是安全的,因为这意味着程序基本上是单线程的。@JoachimPileborg当然这不会导致崩溃,但是这个参数传递肯定不是一个好的做法。你不使用它的原因是什么?与原始pthread API不同,它们是类型安全的。@McKevin Pass
i
。有关向线程传递参数的更多信息,您不应该向线程传递
&i
,它可能会在线程访问它之前增加。这肯定是一场竞赛。@HAL因为OP在
pthread\u create
之后直接调用
pthread\u join
,这是安全的,因为这意味着程序基本上是单线程的。@JoachimPileborg当然这不会导致崩溃,但是这个参数传递肯定不是一个好的做法。你不使用它的原因是什么?与原始pthread API不同,它们是类型安全的。@McKevin Pass
i
。有关向线程传递参数的更多信息,谢谢!!但是现在pthread_self()生成相同的线程id,这是获取线程id的正确方法吗@McKevin它可能会给你相同的线程id,因为你的程序实际上仍然是单线程的。在
pthread\u create
之后直接调用
pthread\u join
,这意味着主线程将等待创建的线程完成,然后再继续。如果要使其真正成为多线程的,则在一个循环中创建线程,然后在另一个循环中对所有创建的线程调用
pthread\u join
。但是要小心,先读一下哈尔的评论。另外,您应该进行一些错误检查(以确保线程创建成功)。谢谢,我打破了创建并连接成两个循环,现在它是多线程的。谢谢!!但是现在pthread_self()生成相同的线程id,这是获取线程id的正确方法吗@McKevin它可能会给你相同的线程id,因为你的程序实际上仍然是单线程的。在
pthread\u create
之后直接调用
pthread\u join
,这意味着主线程将等待创建的线程完成,然后再继续。如果要使其真正成为多线程的,则在一个循环中创建线程,然后在另一个循环中对所有创建的线程调用
pthread\u join
。但是要小心,先读一下哈尔的评论。此外,您还应该进行一些错误检查(以确保线程创建成功)。谢谢,我将创建和连接分成两个循环,现在它是多线程的。
what is i? 0
0x7fffe23e12f00
threads6296496
thread Numb3
Name: Kevin0
Seconds since epoch:
Thread id:1098664256

what is i? 1
0x7fffe23e12f81
threads242525729787
thread Numb3
Name: Kevin1
Seconds since epoch:
Thread id:1098664256

what is i? 2
0x7fffe23e13002
threads47489276644304
thread Numb3
Name: Kevin2
Seconds since epoch:
Thread id:1098664256