我的代碼有問題。它是一個多執行緒程式,執行以下 Linux 命令“# cat | sort | uniq -c | sort -nr”。當我嘗試在虛擬機中運行程式時,出現分段錯誤,沒有核心轉儲。我已經嘗試了一切來解決這個問題,但我仍然得到錯誤。我看到問題出在 main 函式中,我不知道它是什么。可以在 pthread_join 中,也可以是全域宣告的最大執行緒數。有人可以幫我嗎?這是我的代碼。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <unistd.h>
#define MAX_THREADS 0x40
#define MAX_STRING 124ULL
struct string_count_entry {
char* string;
int count;
};
struct string_count {
int nb_string;
struct string_count_entry* entries;
};
struct string_count* string_count_init() {
struct string_count* sc;
sc = malloc(sizeof(sc));
sc->entries = NULL;
sc->nb_string = 0;
return sc;
}
int addstring(struct string_count* pt, char* s) {
int i;
for (i = 0; i < pt->nb_string; i ) {
if (strcmp(pt->entries[i].string, s))
break;
}
if (i == pt->nb_string) {
pt->entries = realloc(pt->entries,
pt->nb_string 1 * sizeof(pt->entries[0]));
if (pt->entries == NULL)
return -1;
pt->nb_string ;
pt->entries[i].string = s;
}
pt->entries[i].count ;
return 0;
}
static inline int Compare(const void* pt1, const void* pt2) {
struct string_count_entry* a = malloc(sizeof(pt2));
struct string_count_entry* b = malloc(sizeof(pt1));
if (a->count == b->count)
return strcmp(a->string, b->string);
return a->count - b->count;
}
void string_count_pint(struct string_count* sc) {
int i;
qsort(sc->entries, sc->nb_string, sizeof(struct string_count), Compare);
i = 0;
while (i < sc->nb_string) {
printf("%d %s\n", sc->entries[i].count, sc->entries[i].string);
i ;
}
}
void string_count_free(void* pt) {
struct string_count* sc = malloc(sizeof(pt));
char i;
for (i = 0; i < sc->nb_string; i ) {
free(sc->entries[i].string);
}
free(sc->entries);
}
char* readline(void) {
int i = 0;
char c;
char* linebuf = (char*)malloc(MAX_STRING);
while (read(0, &c, 1) != 0) {
if (c == '\n') {
linebuf[i] = '\0';
return linebuf;
}
linebuf[i ] = c;
}
return NULL;
}
void* thread_main(void* arg) {
struct string_count* sc = malloc(sizeof(arg));
char* line;
while ((line == readline()) != '\0') {
addstring(sc, line);
}
return NULL;
}
int main(int argc, char** argv) {
int nbthreads;
int i;
pthread_t threads[MAX_THREADS];
struct string_count* sc;
if (argc != 1) {
fprintf(stderr, "usage: %s <nb threads>\n", argv[0]);
return EXIT_FAILURE;
}
nbthreads = atoi(argv[1]);
sc = malloc(sizeof(nbthreads));
for (i = 0; i < nbthreads; i ) {
pthread_create(&threads[i], NULL, thread_main, sc);
}
do {
pthread_join(threads[nbthreads--], NULL);
} while (nbthreads > 0);
string_count_free(sc);
string_count_pint(sc);
return EXIT_SUCCESS;
}
uj5u.com熱心網友回復:
我懷疑這個錯誤是在這一行: sc = malloc(sizeof(nbthreads));
你可能想要 sc = malloc(sizeof(string_count));
我也不確定是否struct string_count* sc = malloc(sizeof(arg));符合您的意圖thread_main。
您可能需要scin main 是一個陣列并將其中的不同專案傳遞給每個執行緒,然后在join.
uj5u.com熱心網友回復:
這是我發現的前幾個錯誤,沒有特別的順序。
- 來自多個執行緒的資料結構的不受保護的修改。閱讀有關多執行緒的內容。注意“互斥”這個詞。
pthread_join(threads[nbthreads--], NULL);超出范圍。struct string_count* sc = malloc(sizeof(arg));沒有意義。sizeof(arg)是指標的大小(在大多數類似 PC 的系統上為 8)。這還不足以容納一個struct string_count。struct string_count_entry* a = malloc(sizeof(pt2));顯然更沒有意義。您在字串比較函式中分配了一些東西,使用了錯誤的大小,然后您使用分配的記憶體而不初始化它,甚至沒有嘗試比較傳遞給函式的東西。while ((line == readline()) != '\0')不分配任何東西。pt->entries = realloc(pt->entries, pt->nb_string 1 * sizeof(pt->entries[0]));缺少幾個括號。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/419676.html
標籤:
上一篇:將指標轉換為不相關的型別
