Я собираюсь догадаться , что это ваша проблема:
char words[ctr][MAXPASS];
Когда вы запускаете однопотоковую программу, у вас достаточно адресного пространства для роста стека, роста библиотек и исполняемых программ, а также кучи в середине.
Но когда вы запускаете многопоточные программы, каждый поток получает свой собственный стек, и я не удивлюсь, если пространство стека, доступное для потоков, будет значительно меньше размера вашего словаря. (См. Справочную страницу pthread_attr_getstack()
в вашей системе для получения сведений о размере стека по умолчанию для каждого потока.)
Выделите этот массив с помощью malloc(3)
и посмотрите, пойдет ли ваша программа дальше.
char *words;
words = malloc(ctr * sizeof(char));
int i; // loop counter variable
for (i = ; i < ctr; i++)
words[i] = malloc(MAXPASS * sizeof(char));
Если вы обнаружите, что множественные вызовы malloc(3)
вводят достаточную фрагментацию памяти, вы можете использовать немного грубое преобразование, чтобы выделить один большой блок памяти и обработать его идентично многомерному массиву:
$ cat multidimensional.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NWORDS 1000
#define WORDLEN 10
void fun(char words[NWORDS][WORDLEN]) {
int i, j;
for (i=0; i<NWORDS; i++) {
strcpy(words[i], "test");
}
for (i=0; i<NWORDS; i++) {
printf("%s\n", words[i]);
}
return;
}
int main(int argc, char* argv[]) {
char *w = malloc(NWORDS * WORDLEN * sizeof(char));
memset(w, 0, NWORDS * WORDLEN * sizeof(char));
fun((char (*)[WORDLEN]) w);
return 0;
}
Вам придется использовать другую функцию, потому что вы не можете назначить массиву, но когда вы пишете функцию, которой должен быть передан массив в качестве аргумента, она фактически затухает до указателя, приведенного в вызове функции : char (*)[WORDLEN]
. (Можно было бы также написать: void fun(char (*)[WORDLEN])
, но я не думаю, что это так же разборчиво.)
Меня всегда немного беспокоит, когда я приглушаю предупреждение с использованием приведения, как я это делал здесь, но при этом выполняется одно большое распределение вместо тысяч маленьких крошечных, что может привести к огромной разнице в производительности. (Проверьте оба и посмотрите.)