struct + pthread_mutex_t

Vasilis Vasaitis vvas at hal.csd.auth.gr
Wed Jan 19 23:55:57 EET 2000


On Wed, Jan 19, 2000 at 11:55:43AM +0200, Nikos Mavroyanopoulos wrote:
> Εχω ενα struct το οποίο μεταξύ άλλων περιέχει ένα pthread_mutex_t
> δηλαδή είναι κάπως έτσι:
> typedef struct {
> /*	[...]*/
> 	pthread_mutex_t lock;
> } mystruct;
> 
> Οταν πάω να κάνω αργότερα initialize  το lock σαν:
> mystruct.lock = PTHREAD_MUTEX_INITIALIZER;
> βγάζει ο compiler: parse error before {'
> 
> ενώ αν το κάνω initialize σαν
> mystruct.lock = (pthread_mutex_t) PTHREAD_MUTEX_INITIALIZER;
> βγάζει το warning: ANSI C forbids constructor expressions
> 
> Ξέρει κάποιος που είναι το λάθος; Φαίνεται να ενοχλεί ότι ο
> initializer είναι της μορφής { 0, kati, kati_allo, klp }, αλλά
> γιατι; 

  Νίκο, το πρόβλημα εδώ είναι ότι προσπαθείς να κάνεις κάτι που δεν παρέχει
η γλώσσα. Βλέποντας το pthread.h, οι ορισμοί του pthread_mutex_t και του
PTHREAD_MUTEX_INITIALIZER είναι οι εξής:

/* Mutexes (not abstract because of PTHREAD_MUTEX_INITIALIZER).  */
typedef struct
{
  int m_spinlock;               /* Spin lock to guarantee mutual exclusion.  */
  int m_count;                  /* 0 if free, > 0 if taken.  */
  _pthread_descr m_owner;       /* Owner of mutex (for recursive mutexes) */
  int m_kind;                   /* Kind of mutex */
  struct _pthread_queue m_waiting; /* Threads waiting on this mutex.  */
} pthread_mutex_t;

#define PTHREAD_MUTEX_INITIALIZER \
  {0, 0, 0, PTHREAD_MUTEX_FAST_NP, {0, 0}}

  Βλέπεις ότι το pthread_mutex_t είναι μία δομή και αντίστοιχα ο
PTHREAD_MUTEX_INITIALIZER είναι αρχικοποιητής δομής. Σύμφωνα με την ANSI C,
μπορείς να δώσεις τιμή σε μία δομή με αυτόν τον τρόπο (με τα επιμέρους
στοιχεία μέσα σε άγκιστρα) μόνο στο σημείο που ορίζεται, και όχι σε
οποιαδήποτε εντολή ανάθεσης. Όταν πάλι βάζεις το cast, χρησιμοποιείς μία
επέκταση του gcc που κάνει ακριβώς αυτό· για περισσότερες λεπτομέρειες, δες
το `info gcc c\ extensions constructors'.

> (τα mutex locks γίνονται μια χαρά initialize αν δεν είναι σε struct)

  Όχι απαραίτητα. Ο παρακάτω κώδικας δεν θα μεταγλωττιστεί σωστά:

#include <pthread.h>

int main(void)
{
    pthread_mutex_t lock;
    lock = PTHREAD_MUTEX_INITIALIZER;
}

  Η λύση στο πρόβλημά σου δόθηκε ήδη σε άλλα μηνύματα, οπότε εγώ σταματάω
στην εξήγηση.

-- 
\  /_. _o|o _ \  /_. _ _.o_|_o _ 
 \/(_|_>|||_>  \/(_|_>(_|| |_|_> 
           __                                   
     _. _ /  \|_  _.|  _ _ _|  _.  _|_|_   _ ._ 
\/\/(_|_>| (|/| |(_||o(__>(_|o(_||_||_| |o(_||  
          \__                              _|   


--
====================================================================
Gia boithia (h na diagrafhte) e-mail sto majordomo at hellug.gr
Ta archives tis listas einai sto http://lists.hellug.gr/lgu.html
prin steilete kapoia erothsh psakte mipos exei hdh apanththei.
Gia opoiodipote problima stilte e-mail ston owner-linux-greek-users at hellug.gr
====================================================================



More information about the Linux-greek-users mailing list