This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
Technical help with pthread_create_key and other key calls
- From: "Mead, Jennifer L - VSCM" <Mead dot Jennifer at vectorscm dot com>
- To: <gcc-help at gcc dot gnu dot org>
- Date: Sat, 16 Sep 2006 12:09:22 -0700
- Subject: Technical help with pthread_create_key and other key calls
-----Original Message-----
From: Mead, Jennifer L - VSCM
Sent: Friday, September 15, 2006 4:03 PM
To: 'gcc-help@gcc.gnu.org'
Subject: Technical help with pthread_create_key and other key calls
Hi C folks,
I am just getting back into C from a 15 hiatus, oh how I missed it. Now
I am trying to write a multi-threaded application that is very very
simple but somehow I cannot make the pthread_setspecific key calls work
for me. I have tried malloc-ing space, and moving all the code calls
everywhere but loose. I think I need help. Below is a skeleton of what
I am trying to do. Can someone tell me how to fix this? Mucho
appreciato.
Background: this C program is redirected in a file with directory names,
I am trying to spin a thread for every directory in the file. There are
over 200 threads I need to start. I don't seem to have a problem doing
that, but the key that I send at the create statement gets written over
everytime and then all the previous threads are looking at the same
directory.
MAIN
--------
pthread_t main_thr;
pthread_t thr;
pthread_attr_t attr;
main_thr = pthread_self();
p=malloc(2);
p = buffer;void *watch_dir(void *arg)
pthread_key_t key;
pthread_key_create(&key, NULL);
thread_setspecific(key, arg);
arg=pthread_getspecific(key);
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, 1);
if (pthread_create(&thr, &attr, watch_dir, p))
{
fprintf(fplog, "Can't create thr\n"), exit(1);
}
WATCH_DIR
------------------
void *watch_dir(void *arg)
{
FILE *fplog;
time_t curtime;
struct tm *loctime;
DIR *dir_p;
struct dirent *dir_entry_p;
pthread_key_t key;
pthread_key_create(&key, NULL);
pthread_setspecific(key, arg);
arg=pthread_getspecific(key);
for (;;)
{
fplog=fopen(FTP_LOG, "a");
curtime = time (NULL); /* get current time */
loctime = localtime (&curtime);
fputs (asctime (loctime), fplog);
sleep(3);
dir_p = opendir(arg);
while( NULL != (dir_entry_p = readdir(dir_p)))
{
if (!((strcmp(dir_entry_p->d_name, ".") == 0) ||
(strcmp(dir_entry_p->d_name, "..") == 0)))
{
fprintf(fplog," %s \n", dir_entry_p->d_name);
/*
holder for FTP Control PERL script
send: arg & dir_entry_p->d_name
directory & filename
*/
}
/*
printf("p is %s\n",p);
Regards,
Jen
Jennifer L Mead
ICC Operations Sr Sys Engineer
Con-way Enterprise Services
503.450.8578 desk
503.550.6589 cell
mead.jennifer@vectorscm.com