Ich arbeite an einem Projekt, das Multithreading beinhaltet. Obwohl ich ein ordentliches Verständnis für Multithreading habe, habe ich nicht viele solche Codes geschrieben. Der folgende Code ist nur ein einfacher Code, den ich für den praktischen Gebrauch geschrieben habe. Es funktioniert gut, wenn es mit gcc -pthread kompiliert wird.Einen Fehler in einem einfachen Multithreading-Programm nicht festhalten können
Um auf diesem Code aufzubauen, muss ich einige Bibliotheken einschließen, die bereits pthread enthalten und verknüpft haben. Wenn ich kompiliere, indem ich diese Bibliotheken einschließe und verlinke, gibt es 3 von 5 Malen einen Segmentierungsfehler. Es gibt ein Problem mit den ersten für -loop in main() - ersetzt diesen für -loop mit mehreren Anweisungen machen die Arbeit.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
#define NUM_THREADS 3
pthread_mutex_t m_lock = PTHREAD_MUTEX_INITIALIZER;
typedef struct{
int id;
char ip[20];
} thread_data;
void *doOperation(void* ctx)
{
pthread_mutex_lock(&m_lock);
thread_data *m_ctx = (thread_data *)ctx;
printf("Reached here\n");
pthread_mutex_unlock(&m_lock);
pthread_exit(NULL);
}
int main()
{
thread_data ctx[NUM_THREADS];
pthread_t threads[NUM_THREADS];
for (int i = 0; i < NUM_THREADS; ++i)
{
char ip_n[] = "127.0.0.";
char ip_h[4];
sprintf(ip_h, "%d", i+1);
strcpy(ctx[i].ip, strcat(ip_n, ip_h));
}
for (int i = 0; i < NUM_THREADS; ++i)
{
pthread_create(&threads[i], NULL, doOperation, (void *)&ctx[i])
}
for (int i = 0; i < NUM_THREADS; ++i)
{
pthread_join(threads[i], NULL);
}
pthread_exit(NULL);
}
'strcat (ip_n, ip_h)' - ruft * undefiniertes Verhalten * auf, wenn 'ip_h' keinen Inhalt hat. – WhozCraig
Aber ip_h hat Inhalt - die String-Version von (i + 1). Ich meine "1", wenn ich 0 ist. –
@SonuMishra, ja, das ist das Problem. –