PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Pthreads Problem



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

arthur
26-02-2003, 18:54
ich würde mal sagen das problem ist die anzahl der threads.
du kannst nur eine festgelegte menge von threads erzeugen, diese unterscheidetet sich aber von system zu system.

brotzi
26-02-2003, 23:32
genau was arthur sagt!
Die Posix-Threads unterstützen laut Spezifikation max 64 Threads (glaube ich). Auf einigen Systemen sind mehr erlaubt. pthread_create sollte aber im Rückgabewert anzeigen ob der Thread erzeugt wurde oder nicht.

sh_
27-02-2003, 22:05
Ok, danke fuer die Antworten.
Hatte eigentlich auch schon mit einer einfachen Limitierung gerechnet.
Ist das Limit denn auf den user, prozess oder das ganze System bezogen und
kann man das Limit erhoehen/aendern?

/sh

anda_skoa
27-02-2003, 23:32
Ich denke es gibt unterschiedliche Limits für die einzelnen Bereiche.

Eventuell lassen sich welche mit ulimit ändern.

Oder es sind Konstantem im Kernel.

Ciao,
_