This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Technical help with pthread_create_key and other key calls


Hi Jen -

This is not really a gcc related question.  You might try a forum like
the ones at www.unix.com

Brian

On 9/16/06, Mead, Jennifer L - VSCM <Mead.Jennifer@vectorscm.com> wrote:


-----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





Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]