当我运行此代码时,我只会得到一条直接的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 = 0
将input
的内存地址设置为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/