当我运行此代码时,我只会得到一条直接的Seg错误。我不知道如何解决。我正在尝试创建一个简单的多线程编程。它完全可以编译,但是当我通过键入“ ./testing”,打印语句“ what?”运行它时,它可以编译。在主要功能的开始甚至不会打印,只是段错误。我已经坚持了几个小时。有任何想法吗?谢谢

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

static pthread_mutex_t mutex1;
static pthread_mutex_t mutex2;

static int arrayX[4];
static int arrayY[4];

static pthread_t threads[20];

static void *function(void *index) {
    pthread_mutex_lock(&mutex1);
    int *in = (int *)index;
    arrayX[*in]++;
    pthread_mutex_unlock(&mutex1);

    pthread_mutex_lock(&mutex2);
    arrayY[*in]--;
    printf("X Finished");

    pthread_mutex_unlock(&mutex2);
}

void main() {
    printf("what?");
    //initialize the mutex
    pthread_mutex_init(&mutex1, NULL);
    pthread_mutex_init(&mutex2, NULL);

    //Initialize the arrayX
    int x = 0;
    for (x; x < 4; x++) {
        arrayX[x] = 0;
        printf("START arrayX[%d]: %d", x, arrayX[x]);
    }

    //Initialize the arrayY
    for (x = 0; x < 4; x++) {
        arrayY[x] = 0;
        printf("START arrayY[%d]: %d", x, arrayY[x]);
    }

    pthread_mutex_init(&mutex1, NULL);
    pthread_mutex_init(&mutex2, NULL);

    int *input = 0;
        for (x = 0; x < 20; x++) {
        *input = x % 4;
        pthread_create(&(threads[x]), NULL, function, input);
    }
}

最佳答案

int *input = 0input的内存地址设置为nullptr,因此您不能在该地址中存储数据,因为它是无效的,您可以将其保留为未初始化的int *input,然后将其分配给,编译器将选择合适的可用内存位置,然后将数据分配给该位置。

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static pthread_mutex_t mutex1;
static pthread_mutex_t mutex2;
static pthread_t threads[20];
static int arrayX[4];
static int arrayY[4];

static void *function (void *index)
{
    int in = *((int *) index);
    pthread_mutex_lock (&mutex1);
    arrayX[in]++;
    pthread_mutex_unlock (&mutex1);
    pthread_mutex_lock (&mutex2);
    arrayY[in]--;
    pthread_mutex_unlock (&mutex2);
    // printf ("X Finished\n");
}

int main (int argc __attribute__((unused)), char **argv __attribute__((unused)))
{
    int x = 0;
    int *input;

    printf ("what?\n");
    // Initialize the mutex
    pthread_mutex_init (&mutex1, NULL);
    pthread_mutex_init (&mutex2, NULL);
    // Initialize arrayX and arrayY
    memset (arrayX, 0, sizeof (arrayX));
    memset (arrayY, 0, sizeof (arrayY));
    // Increment values inside arrays
    for (x = 0; x < 20; x++)
    {
        *input = x % 4;
        pthread_create (&(threads[x]), NULL, function, input);
    }
    // Print array values
    for (x = 0; x < 4; x++) printf ("arrayX[%d]: %d\n", x, arrayX[x]);
    for (x = 0; x < 4; x++) printf ("arrayY[%d]: %d\n", x, arrayY[x]);

    return 0;
}


编辑:

取消引用(这意味着使用int运算符将值赋值给已声明的指针,即*)未初始化的指针(这意味着声明一个指针而不为其赋值,即*ptr = something)不是一个好习惯,尽管它可能可以正常工作,但有时可能导致崩溃,这是因为未初始化的指针可能指向系统正在使用的内存地址,这会导致Undefined Behaviour并可能导致崩溃。正确的方法是初始化指向int *pointer;的指针或使用NULL获取有效的指针,但是,当您初始化指向malloc的指针时,您不能取消引用它,因为它是无效的指针。

因此,与其做:

int *input;
*input = x % 4;


我们可以做的:

int *input;
input = malloc (sizeof (int));
*input = x % 4;


当将NULL指针发送到一个线程然后更改其值并将其发送到另一个线程时,input值也将在第一个线程中更改为新值,这是因为您共享相同的指针(因此具有相同的内存地址)与所有线程。为了确保每个线程都能获得预期的输入值,您可以执行以下操作:

for (x = 0; x < 20; x++)
{
    // Create a new valid pointer
    input = malloc (sizeof (int));
    *input = x % 4;
    pthread_create (&(threads[x]), NULL, function, input);
}


这将向每个线程传递不同的指针,但是,例如,当您使用input动态分配内存时,您必须释放此分配的内存,我们可以在每个线程内执行此操作:

static void *function (void *index)
{
    int *in = (int *) index;

    pthread_mutex_lock (&mutex1);
    arrayX[*in]++;
    pthread_mutex_unlock (&mutex1);

    pthread_mutex_lock (&mutex2);
    arrayY[*in]--;
    printf ("X Finished");
    pthread_mutex_unlock (&mutex2);

    // Freeing the allocated memory
    free (in);
}


当使用input创建线程时,主线程会在到达malloc函数的结尾时终止,而无需等待其他线程完成工作,除非您告诉主线程等待它们,否则我们可以使用pthread_creat

// Create new threads
for (x = 0; x < 20; x++)
{
    *input = x % 4;
    pthread_create (&(threads[x]), NULL, function, (void *) input);
}
// Wait for the threads to finish
for (x = 0; x < 20; x++)
{
    pthread_join (threads[x], NULL);
}


这将强制主线程保持运行状态,直到所有其他线程在退出之前完成工作为止。

关于c - C编程多线程段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33600601/

10-16 07:57