sh_
26-02-2003, 14:27
Hi,
habe bei dem folgendem Programm einige Merkwuerdigkeiten festgestellt.
Es wurde mit mehreren Betriebssystemen und Compilern getestet und es
kamen meist nicht zufriedenstellende Ergebnisse heraus.
Die 2 am meisten aufgetretenden Probleme waren falsche Ergebnisse
oder komplettes Haengenbleiben des Programms.
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#define LOG_FILE "pt.log"
#define NUM_THREADS 1100
#define NUM_MESSAGES 1
int count = 0;
typedef struct _pt {
int fd;
pthread_mutex_t mutex;
} pt;
void* log(void *p);
int
main(void)
{
pt h;
int t;
pthread_t threads[NUM_THREADS];
if ( (h.fd = open(LOG_FILE, O_WRONLY | O_CREAT |
O_TRUNC)) == -1)
return -1;
pthread_mutex_init(&h.mutex, NULL);
for (t = 0; t < NUM_THREADS; ++t)
pthread_create(&threads[t], NULL, log, &h);
for (t = 0; t < NUM_THREADS; ++t)
pthread_join(threads[t], NULL);
close(h.fd);
printf("Wrote %d times.\n", count);
pthread_mutex_destroy(&h.mutex);
pthread_exit(NULL);
return 0;
}
#define CNT 7
#define BUF "Foobar\n"
void*
log(void *p)
{
int i;
pt *h = (pt *) p;
pthread_mutex_lock(&h->mutex);
for (i = 0; i < NUM_MESSAGES; ++i)
if (write(h->fd, BUF, CNT) != CNT)
perror("write()");
++count;
pthread_mutex_unlock(&h->mutex);
pthread_exit(NULL);
}
Normalerweise sollte da in dem Fall "Wrote 1100 times." herauskommen,
allerdings kommt oft sowas wie 1021 oder gar noch viel weniger heraus. Manchmal
bleibt das Programm auch, wie es scheint, in einer Endlosschleife einfach haengen.
Folgendes ist mir mit `strace' aufgefallen, bringt mich aber auch nicht weiter:
--- SIGRTMIN (Real-time signal 0) ---
<... rt_sigsuspend resumed> ) = -1 EINTR (Interrupted system call)
sigreturn() = ? (mask now [RTMIN])
rt_sigprocmask(SIG_SETMASK, NULL, [RTMIN], 8) = 0
write(5, "\0\323\2@\0\0\0\0\0\0\0\0l\210\4\10\320\372\377\27 7\0\0"..., 148) = 14
8
rt_sigprocmask(SIG_SETMASK, NULL, [RTMIN], 8) = 0
rt_sigsuspend([] <unfinished ...>
Vielleicht weiss ja einer von euch wo das Problem liegt.
/sh
habe bei dem folgendem Programm einige Merkwuerdigkeiten festgestellt.
Es wurde mit mehreren Betriebssystemen und Compilern getestet und es
kamen meist nicht zufriedenstellende Ergebnisse heraus.
Die 2 am meisten aufgetretenden Probleme waren falsche Ergebnisse
oder komplettes Haengenbleiben des Programms.
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#define LOG_FILE "pt.log"
#define NUM_THREADS 1100
#define NUM_MESSAGES 1
int count = 0;
typedef struct _pt {
int fd;
pthread_mutex_t mutex;
} pt;
void* log(void *p);
int
main(void)
{
pt h;
int t;
pthread_t threads[NUM_THREADS];
if ( (h.fd = open(LOG_FILE, O_WRONLY | O_CREAT |
O_TRUNC)) == -1)
return -1;
pthread_mutex_init(&h.mutex, NULL);
for (t = 0; t < NUM_THREADS; ++t)
pthread_create(&threads[t], NULL, log, &h);
for (t = 0; t < NUM_THREADS; ++t)
pthread_join(threads[t], NULL);
close(h.fd);
printf("Wrote %d times.\n", count);
pthread_mutex_destroy(&h.mutex);
pthread_exit(NULL);
return 0;
}
#define CNT 7
#define BUF "Foobar\n"
void*
log(void *p)
{
int i;
pt *h = (pt *) p;
pthread_mutex_lock(&h->mutex);
for (i = 0; i < NUM_MESSAGES; ++i)
if (write(h->fd, BUF, CNT) != CNT)
perror("write()");
++count;
pthread_mutex_unlock(&h->mutex);
pthread_exit(NULL);
}
Normalerweise sollte da in dem Fall "Wrote 1100 times." herauskommen,
allerdings kommt oft sowas wie 1021 oder gar noch viel weniger heraus. Manchmal
bleibt das Programm auch, wie es scheint, in einer Endlosschleife einfach haengen.
Folgendes ist mir mit `strace' aufgefallen, bringt mich aber auch nicht weiter:
--- SIGRTMIN (Real-time signal 0) ---
<... rt_sigsuspend resumed> ) = -1 EINTR (Interrupted system call)
sigreturn() = ? (mask now [RTMIN])
rt_sigprocmask(SIG_SETMASK, NULL, [RTMIN], 8) = 0
write(5, "\0\323\2@\0\0\0\0\0\0\0\0l\210\4\10\320\372\377\27 7\0\0"..., 148) = 14
8
rt_sigprocmask(SIG_SETMASK, NULL, [RTMIN], 8) = 0
rt_sigsuspend([] <unfinished ...>
Vielleicht weiss ja einer von euch wo das Problem liegt.
/sh