Messages in this thread | | | Date | Tue, 16 Jan 2007 02:47:10 +0100 | From | "J.A. Magallón" <> | Subject | Problem with POSIX threads in latest kernel... |
| |
Hi...
I run the (almost) latest -mm kernel (2.6.20-rc3-mm1), and see some strange behaviour with POSIX threads (glibc-2.4). I have downgraded my test to a simple textboox example for a SMP-safe spool queue, it's just a circular queue with a mutex and a condition variable for in and out. I have seen the same structure in several places.
Well, it just sometimes gets blocked. GDB says its stuck in pthread_wait(). I could swear it worked on previous kernels. It works as is on IRIX. I will try to build an older kernel to test. I takes a second to block it with something like while :; tst; done.
Any ideas ?
-- J.A. Magallon <jamagallon()ono!com> \ Software is like sex: \ It's better when it's free Mandriva Linux release 2007.1 (Cooker) for i586 Linux 2.6.19-jam04 (gcc 4.1.2 20061110 (prerelease) (4.1.2-0.20061110.2mdv2007.1)) #0 SMP PREEMPT #include <stdlib.h> #include <unistd.h> #include <stdio.h> #include <pthread.h>
#define SIZE 16
int jobs[SIZE]; int in; int slots; pthread_mutex_t slots_mutex; pthread_cond_t slots_cond; int out; int items; pthread_mutex_t items_mutex; pthread_cond_t items_cond;
void put(int job); void get(int* job); void* prod(void* data); void* cons(void* data);
int main(int argc,char** argv) { pthread_t prodid,consid;
in = 0; slots = SIZE; pthread_mutex_init(&slots_mutex,0); pthread_cond_init(&slots_cond,0); out = 0; items = 0; pthread_mutex_init(&items_mutex,0); pthread_cond_init(&items_cond,0);
pthread_setconcurrency(3); pthread_create(&prodid,0,prod,0); pthread_create(&consid,0,cons,0);
pthread_join(prodid,0); pthread_join(consid,0);
return 0; }
void* prod(void* data) { int i;
for (i=0; i<1000; i++) { if (!(i%100)) printf("put %d\n",i); put(i); } put(-1); puts("prod done");
return 0; }
void* cons(void* data) { int i; do { get(&i); if (!(i%100)) printf("got %d\n",i); } while (i>=0); puts("cons done");
return 0; }
void put(int job) { pthread_mutex_lock(&slots_mutex); while (slots<=0) pthread_cond_wait(&slots_cond,&slots_mutex); jobs[in] = job; in++; in %= SIZE; slots--; items++; pthread_mutex_unlock(&slots_mutex);
pthread_mutex_lock(&items_mutex); pthread_cond_signal(&items_cond); pthread_mutex_unlock(&items_mutex); }
void get(int* job) { pthread_mutex_lock(&items_mutex); while (items<=0) pthread_cond_wait(&items_cond,&items_mutex); *job = jobs[out]; out++; out %= SIZE; items--; slots++; pthread_mutex_unlock(&items_mutex);
pthread_mutex_lock(&slots_mutex); pthread_cond_signal(&slots_cond); pthread_mutex_unlock(&slots_mutex); }
| |