Прошу помощи у знающих людей.Создаю процессы с помощью clone() с флагами: CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | SIGCHLD | CLONE_SYSVSEM.
Если добавить флаг CLONE_THREAD, то все работает нормально, но этот флаш не нужен.
При этом когда они начиют конкурировать между собой, возникает deadlock в функциях malloc()/free()
используется clone(), а не fork() потому что в приложении нужно шарить очень много данных.
используется clone(), а не pthread_create() потому что при смерти треда (seg fault) завершается сразу все приложение.
То есть хочется что бы и процессы между собой все делили, и при этом были независимы друг от друга в случае смерти.
В функциях glibc есть внутренние блокировки, непонятно только почему они заходят в deadlock.
Код для демонстрации:
int func(void *p)
{
while (1) {
p = (char *)malloc(6);
memcpy(p, "12345\0", 5);
free(p);
}
}
#define STACK_SIZE 1024*1024
int main()
{
int i;
for (i=0; i<10; i++) {
void *stack = malloc(STACK_SIZE);
int flags = CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | SIGCHLD | CLONE_SYSVSEM;
int id = clone(func, (char *)stack + STACK_SIZE, flags, NULL);
}
sleep(10000);
return 0;
}