Witam,
proszę o wskazówki - co w poniższym programie może powodować naruszenie ochrony pamięci w systemie Linuks?
Inny system, na którym testowałem poniższą aplikację to FreeBSD.
W systemie Linuks testowałem aplikację z glibc oraz z musl-libc - w obu przypadkach otrzymywałem naruszenie ochrony pamięci.
W systemie FreeBSD (TrueOS) naruszenia pamięci nie było.
Liczba tworzonych wątków praktycznie nie ma wpływu na wstepowanie naruszenia ochrony pamięci - wpłwa jedynie na częstotliwość tego zjawiska.
Program:
#include <unistd.h>
#include <stdio.h>
#include <pthread.h>
#define QSIZE 100000
pthread_mutex_t lock;
int active = QSIZE;
static void *threadapp(void *o)
{
pthread_mutex_lock(&lock);
active--;
pthread_mutex_unlock(&lock);
pthread_exit(NULL);
}
int main(int argc, char *argv[])
{
pthread_attr_t attr;
int i;
pthread_mutex_init(&lock, NULL);
if(pthread_attr_init(&attr) != 0) {
perror("attr init");
return 1;
}
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
for(i=0;;++i) {
int j;
printf("%d: Start", i);
fflush(stdout);
active = QSIZE;
for(j=0; j<QSIZE; ++j) {
int status;
do {
pthread_t ret;
status = pthread_create(&ret, &attr, &threadapp, NULL);
}
while(status != 0);
}
for(;;) {
pthread_mutex_lock(&lock);
if(active == 0) {
pthread_mutex_unlock(&lock);
break;
}
pthread_mutex_unlock(&lock);
}
printf("...Done\n");
}
if(pthread_attr_destroy(&attr) != 0) {
perror("attr destroy");
return 1;
}
return 0;
}
Kompilacja i uruchomienie:
gcc multitest.c -o multitest -pthread
while ./multitest ; do sleep 0; done
Z tego co zaobserwowałem - dodanie dodatkowych poleceń do wątku powoduje dłuższe działanie aplikacji bez naruszenia ochrony
pamięci.
Będę wdzięczny za pomoc w namierzeniu błędu. Być może czegoś w obsłudze wątków nie rozumiem i przeoczyłem np. maskowanie
sygnałów.