# \[Resolu\] Conflit entre thread.h et pthreadtype.h

**URL:** <https://www.debian-fr.org/t/resolu-conflit-entre-thread-h-et-pthreadtype-h/6484>\
**Category:** Programmation\
**Created:** [Février 20, 2016, 3:35 UTC](https://www.debian-fr.org/t/resolu-conflit-entre-thread-h-et-pthreadtype-h/6484 "2016-02-20T15:35:32Z")\
**Posts on this page:** 10\
**Page:** 1

<div class="post-metadata">

**Author:** ![MLIBRE](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/b4bc9f/32.png) [@MLIBRE](https://www.debian-fr.org/u/MLIBRE)\
**Post date:** [Février 20, 2016, 3:35 UTC](https://www.debian-fr.org/t/resolu-conflit-entre-thread-h-et-pthreadtype-h/6484/1 "2016-02-20T15:35:32Z")

</div>

Je viens d’installer une Debian etch dont voici quelques caractéristiques !

```auto
$ uname -a
Linux debian 2.6.18-3-686 #1 SMP Mon Dec 4 16:41:14 UTC 2006 i686 GNU/Linux
$ gcc -v
Utilisation des specs internes.
Target: i486-linux-gnu
Configuré avec: ../src/configure -v --enable-languages=c,c++,fortran,objc,obj-c++,treelang -- prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gette xt --enable-threads=posix --enable-nls --program-suffix=-4.1 --enable-__cxa_atexit --enable-c locale=gnu --enable-libstdcxx-debug --enable-mpfr --with-tune=i686 --enable-checking=release i486-linux-gnu
Modèle de thread: posix
version gcc 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)
```

J’ai essayé vainement de compiler xine-lib à cause d’un problème sur les pthread. Alors  
j’ai fait un test avec les exemples du chapitre 12 du livre "Programmation système en C sous  
linux de C. Blaess et je suis tombé sur la même erreur de compilation. Lorsque #include \<pthread.h\>  
précède #include \<stdlib.h\>, la compilation réussit. Voici le source de l’exemple :

```auto
/ *********************************************************************** \
   exemple_create
 
   Programme d'exemple du livre "Developpement systeme en C sous Linux"
   
   (c) 2000,2005 - Christophe Blaess
 
\ *********************************************************************** /

	#define _XOPEN_SOURCE 500
	#include <pthread.h>
	#include <stdio.h>
	#include <stdlib.h>
	#include <stdio.h>
	#include <string.h>
	#include <unistd.h>

	#define NB_THREADS	5

	void * fn_thread (void * numero);

	static int compteur = 0;

	int
main (void)
{

	pthread_t thread[NB_THREADS];
	int i;
	int ret;

	for (i = 0; i < NB_THREADS; i ++)
		if ((ret = pthread_create (& thread[i],
									NULL, 
                                    fn_thread, 
                                    (void *) i)) != 0) {
			fprintf(stderr, "%d : %s", i, strerror(ret));
			exit(EXIT_FAILURE);
		}

	while (compteur < 40) {
		fprintf(stdout, "main : compteur = %d\n", compteur);
		sleep(1);
	}
	for (i = 0; i < NB_THREADS; i ++)
		pthread_join(thread[i], NULL);

	return EXIT_SUCCESS;
}

	void *
fn_thread (void * num)
{
	int numero = (int) num;
	while (compteur < 40) {
		usleep(numero * 100000);
		compteur ++;
		fprintf(stdout, "Thread %d : compteur = %d\n", numero, compteur);
	}
	pthread_exit(NULL);
}
```

La compilation réussit :

```auto
$ make exemple_create
cc -Wall -pedantic -g -pthread exemple_create.c -o exemple_create
exemple_create.c: In function 'fn_thread':
exemple_create.c:61: attention : control reaches end of non-void function
```

En mettant la ligne #include \<pthread.h\> après #include \<stdlib.h\>, la  
compilation échoue. Voici les messages :

```auto
$ make exemple_create
cc -Wall -pedantic -g -pthread exemple_create.c -o exemple_create
In file included from exemple_create.c:13:
/usr/include/pthread.h:285: erreur: conflicting types for 'pthread_t'
/usr/include/bits/pthreadtypes.h:152: erreur: previous declaration of 'pthread_t' was here
/usr/include/pthread.h:286: erreur: conflicting types for 'pthread_attr_t'
/usr/include/bits/pthreadtypes.h:54: erreur: previous declaration of 'pthread_attr_t' was here
/usr/include/pthread.h:287: erreur: conflicting types for 'pthread_key_t'
/usr/include/bits/pthreadtypes.h:82: erreur: previous declaration of 'pthread_key_t' was here
/usr/include/pthread.h:289: erreur: conflicting types for 'pthread_mutexattr_t'
/usr/include/bits/pthreadtypes.h:102: erreur: previous declaration of 'pthread_mutexattr_t' was here
/usr/include/pthread.h:290: erreur: conflicting types for 'pthread_mutex_t'
/usr/include/bits/pthreadtypes.h:95: erreur: previous declaration of 'pthread_mutex_t' was here
/usr/include/pthread.h:291: erreur: conflicting types for 'pthread_condattr_t'
/usr/include/bits/pthreadtypes.h:79: erreur: previous declaration of 'pthread_condattr_t' was here
/usr/include/pthread.h:292: erreur: conflicting types for 'pthread_cond_t'
/usr/include/bits/pthreadtypes.h:72: erreur: previous declaration of 'pthread_cond_t' was here
/usr/include/pthread.h:293: erreur: conflicting types for 'pthread_rwlockattr_t'
/usr/include/bits/pthreadtypes.h:128: erreur: previous declaration of 'pthread_rwlockattr_t' was here
/usr/include/pthread.h:294: erreur: conflicting types for 'pthread_rwlock_t'
/usr/include/bits/pthreadtypes.h:120: erreur: previous declaration of 'pthread_rwlock_t' was here
exemple_create.c: In function 'fn_thread':
exemple_create.c:61: attention : control reaches end of non-void function
make: *** [exemple_create] Erreur 1
```

Dans le cas des applis que je veux compiler (xine-lib, xine-ui, vdr, vdr-plugin-xine), j’ai essayé de  
mettre systématiquement le #include \<pthread.h\> en tête des fichiers, mais il y a plus de 100 fichiers  
à modifier, alors j’ai abandonné, car il y a surement une solution moins bestiale.

Je pense qu’il y a un problème dans mon installation qui est pourtant récente (moins de 2 mois).  
J’ai parcouru les forums pour m’apercevoir que ce problème est souvent signalé, mais aucune  
explication ou réponse n’est donnée, en dehors du conseil de mettre le #include \<pthread.h\> avant  
le #include \<stdlib.h\>.

J’ai demandé son avis à Christophe Blaess par mail. Il émet l’hypothèse d’une erreur dans des fichiers  
d’en-tête de la GlibC utilisée par cette version de la distribution. J’ai regardé le fichier  
/usr/include/features.h, mais c’est au delà de mes compétences.

Avez-vous une idée sur l’origine de ce problème et la manière de le contourner ?

Cordialement, Michel.

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 20, 2016, 3:35 UTC](https://www.debian-fr.org/t/resolu-conflit-entre-thread-h-et-pthreadtype-h/6484/2 "2016-02-20T15:35:34Z")

</div>

pourquoi as-tu deux fois  
#include \<stdio.h\>  
❓

---

<div class="post-metadata">

**Author:** ![mattotop](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mattotop/32/3942_2.png) [@mattotop](https://www.debian-fr.org/u/mattotop)\
**Post date:** [Février 20, 2016, 3:35 UTC](https://www.debian-fr.org/t/resolu-conflit-entre-thread-h-et-pthreadtype-h/6484/3 "2016-02-20T15:35:34Z")

</div>

Tu as essayé bêtement de mettre un #include \<pthread.h\> dans \<stdlib.h\> ?

---

<div class="post-metadata">

**Author:** ![MLIBRE](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/b4bc9f/32.png) [@MLIBRE](https://www.debian-fr.org/u/MLIBRE)\
**Post date:** [Février 20, 2016, 3:35 UTC](https://www.debian-fr.org/t/resolu-conflit-entre-thread-h-et-pthreadtype-h/6484/4 "2016-02-20T15:35:42Z")

</div>

Le problème n’est pas si simple. Les compilations réussisent lorsque  
pthread.h est inclus avant bits/pthreadtypes.h. Si on regarde dans  
/usr/include quels sont le \*.h qui incluent bits/pthreadtypes.h, on  
trouve :

```auto
sys/types.h:266:# include <bits/pthreadtypes.h>
signal.h:386:# include <bits/pthreadtypes.h>
nptl/pthread.h:28:#include <bits/pthreadtypes.h>
```

Il semble donc qu’il faille que pthread.h soit inclut avant sys/types.h, mais  
si on regarde qui inclut sys/types.h on trouve :

```auto
xine/os_types.h:46:# include <sys/types.h>
xine/os_types.h:58:# include <sys/types.h>
xine/buffer.h:47:#include <sys/types.h>
xine/input_plugin.h:26:#include <sys/types.h>
stdlib.h:433:# include <sys/types.h> /* we need int32_t... */
sys/mtio.h:26:#include <sys/types.h>
sys/quota.h:41:#include <sys/types.h>
sys/bitypes.h:3:#include <sys/types.h>
sys/gmon.h:37:#include <sys/types.h>
sys/uio.h:24:#include <sys/types.h>
sys/xattr.h:23:#include <sys/types.h>
sys/profil.h:25:#include <sys/types.h>
sys/acct.h:26:#include <sys/types.h>
sys/epoll.h:23:#include <sys/types.h>
sys/sendfile.h:24:#include <sys/types.h>
sys/ustat.h:29:#include <sys/types.h>
sys/fsuid.h:23:#include <sys/types.h>
sys/procfs.h:33:#include <sys/types.h>
sys/param.h:42:#include <sys/types.h>
pthread.h:111:#include <sys/types.h> /* for ssize_t */
fontconfig/fontconfig.h:28:#include <sys/types.h>
dialog.h:33:#include <sys/types.h>
aliases.h:24:#include <sys/types.h>
gcrypt.h:30:#include <sys/types.h>
pngconf.h:296:# include <sys/types.h>
resolv.h:56:#include <sys/types.h>
netinet/icmp6.h:24:#include <sys/types.h>
netinet/ip.h:23:#include <sys/types.h>
netinet/tcp.h:54:# include <sys/types.h>
netinet/if_tr.h:23:#include <sys/types.h>
netinet/udp.h:52:#include <sys/types.h>
netinet/if_fddi.h:23:#include <sys/types.h>
netinet/ip_icmp.h:23:#include <sys/types.h>
netinet/in_systm.h:24:#include <sys/types.h>
netinet/igmp.h:23:#include <sys/types.h>
netinet/if_ether.h:23:#include <sys/types.h>
icc34.h:222:#include <sys/types.h>
linux/types.h:6:# include <sys/types.h>
linux/input.h:18:#include <sys/types.h>
linux/coda.h:66:#include <sys/types.h>
aio.h:30:#include <sys/types.h>
audio/Aos.h:63:#include <sys/types.h> /* forgot to protect it... */
audio/Aos.h:69:#include <sys/types.h>
audio/Aos.h:72:#include <sys/types.h>
audio/audiolib.h:52:#include <sys/types.h> /* forgot to protect it... */
audio/audiolib.h:58:#include <sys/types.h>
audio/audiolib.h:61:#include <sys/types.h>
X11/Xpoll.h:86:# include <sys/types.h>
X11/Xos_r.h:567:# include <sys/types.h>
X11/Xlib.h:43:#include <sys/types.h> /* forgot to protect it... */
X11/Xlib.h:49:#include <sys/types.h>
X11/Xlib.h:52:#include <sys/types.h>
X11/Xtrans/Xtransutil.c:507:#include <sys/types.h>
X11/Xtrans/Xtranslcl.c:92:#include <sys/types.h>
X11/Xos.h:51:#include <sys/types.h> /* forgot to protect it... */
X11/Xos.h:57:#include <sys/types.h>
X11/Xos.h:60:# include <sys/types.h>
X11/Xarch.h:53:#include <sys/types.h>
X11/extensions/lbxopts.h:79:#include <sys/types.h>
lcms.h:135:# include <sys/types.h>
rpc/types.h:68:#include <sys/types.h>
rpc/pmap_rmt.h:42:#include <sys/types.h>
rpc/auth_unix.h:49:#include <sys/types.h>
rpc/clnt.h:41:#include <sys/types.h>
rpc/rpc_des.h:38:#include <sys/types.h>
rpc/xdr.h:40:#include <sys/types.h>
vdr/filter.h:13:#include <sys/types.h>
vdr/thread.h:15:#include <sys/types.h>
vdr/tools.h:23:#include <sys/types.h>
vdr/libsi/util.h:17:#include <sys/types.h>
qt3/private/qsharedmemory_p.h:54:#include <sys/types.h>
zconf.h:288:# include <sys/types.h> /* for off_t */
nptl/semaphore.h:23:#include <sys/types.h>
nptl/thread_db.h:28:#include <sys/types.h>
gnutls/gnutls.h:59:#include <sys/types.h>
libpng/pngconf.h:296:# include <sys/types.h>
netipx/ipx.h:24:#include <sys/types.h>
libpng12/pngconf.h:296:# include <sys/types.h>
ftw.h:28:#include <sys/types.h>
spawn.h:26:#include <sys/types.h>
link.h:27:#include <sys/types.h>
semaphore.h:19:#include <sys/types.h>
xine.h:48:#include <sys/types.h>
utmp.h:24:#include <sys/types.h>
bits/fcntl.h:26:#include <sys/types.h>
bits/sem.h:23:#include <sys/types.h>
bits/uio.h:24:#include <sys/types.h>
bits/ustat.h:23:#include <sys/types.h>
bits/socket.h:32:#include <sys/types.h>
bits/utmp.h:27:#include <sys/types.h>
protocols/rwhod.h:35:#include <sys/types.h>
protocols/talkd.h:53:#include <sys/types.h>
net/if.h:26:# include <sys/types.h>
net/route.h:26:#include <sys/types.h>
net/ethernet.h:26:#include <sys/types.h>
net/if_shaper.h:23:#include <sys/types.h>
net/if_arp.h:28:#include <sys/types.h>
net/if_ppp.h:51:#include <sys/types.h>
regex.h:25:#include <sys/types.h>
fts.h:36:#include <sys/types.h>
thread_db.h:28:#include <sys/types.h>
arpa/nameser.h:60:# include <sys/types.h>
mqueue.h:24:#include <sys/types.h>
libtasn1.h:36:#include <sys/types.h>
cups/http.h:37:# include <sys/types.h>
cups/file.h:38:# include <sys/types.h>
```

soit 106 fichiers dans mon cas. Dans le cas d’une grosse appli de  
plusieurs centaines de \*.c, il ne me reste qu’à inclure systématiquement  
pthread.h à la première ligne de chaque fichier. C’est faisable, mais il y  
a surement une méthode plus élégante.

Voici un test plus simple que celui mis dans mon premier post. Source de foo.c :

```auto
#include <sys/types.h>
#include <pthread.h>
extern int puts ( __const char *__ s);
int main (void) { puts("Coucou !"); return 0;}
```

Compilation avec gcc-3.4 :

```auto
$ /usr/bin/gcc-3.4 -Wall -pthread foo.c -o foo
In file included from foo.c:2:
/usr/include/pthread.h:285: erreur: types conflictuels pour « pthread_t »
/usr/include/bits/pthreadtypes.h:152: erreur: déclaration précédente de « pthread_t » était ici
/usr/include/pthread.h:286: erreur: types conflictuels pour « pthread_attr_t »
/usr/include/bits/pthreadtypes.h:54: erreur: déclaration précédente de « pthread_attr_t » était ici
/usr/include/pthread.h:287: erreur: types conflictuels pour « pthread_key_t »
/usr/include/bits/pthreadtypes.h:82: erreur: déclaration précédente de « pthread_key_t » était ici
/usr/include/pthread.h:289: erreur: types conflictuels pour « pthread_mutexattr_t »
/usr/include/bits/pthreadtypes.h:102: erreur: déclaration précédente de « pthread_mutexattr_t » était ici
/usr/include/pthread.h:290: erreur: types conflictuels pour « pthread_mutex_t »
/usr/include/bits/pthreadtypes.h:95: erreur: déclaration précédente de « pthread_mutex_t » était ici
/usr/include/pthread.h:291: erreur: types conflictuels pour « pthread_condattr_t »
/usr/include/bits/pthreadtypes.h:79: erreur: déclaration précédente de « pthread_condattr_t » était ici
/usr/include/pthread.h:292: erreur: types conflictuels pour « pthread_cond_t »
/usr/include/bits/pthreadtypes.h:72: erreur: déclaration précédente de « pthread_cond_t » était ici
```

avec gcc-4.1 :

```auto
$ /usr/bin/gcc-4.1 -Wall -pthread foo.c -o foo
In file included from foo.c:2:
/usr/include/pthread.h:285: erreur: conflicting types for 'pthread_t'
/usr/include/bits/pthreadtypes.h:152: erreur: previous declaration of 'pthread_t' was here
/usr/include/pthread.h:286: erreur: conflicting types for 'pthread_attr_t'
/usr/include/bits/pthreadtypes.h:54: erreur: previous declaration of 'pthread_attr_t' was here
/usr/include/pthread.h:287: erreur: conflicting types for 'pthread_key_t'
/usr/include/bits/pthreadtypes.h:82: erreur: previous declaration of 'pthread_key_t' was here
/usr/include/pthread.h:289: erreur: conflicting types for 'pthread_mutexattr_t'
/usr/include/bits/pthreadtypes.h:102: erreur: previous declaration of 'pthread_mutexattr_t' was here
/usr/include/pthread.h:290: erreur: conflicting types for 'pthread_mutex_t'
/usr/include/bits/pthreadtypes.h:95: erreur: previous declaration of 'pthread_mutex_t' was here
/usr/include/pthread.h:291: erreur: conflicting types for 'pthread_condattr_t'
/usr/include/bits/pthreadtypes.h:79: erreur: previous declaration of 'pthread_condattr_t' was here
/usr/include/pthread.h:292: erreur: conflicting types for 'pthread_cond_t'
/usr/include/bits/pthreadtypes.h:72: erreur: previous declaration of 'pthread_cond_t' was here
```

Modification du fichier. pthread.h est mis avant sys/types.h :

```auto
#include <pthread.h>
#include <sys/types.h>
extern int puts ( __const char *__ s);
int main (void) { puts("Coucou !"); return 0;}
```

Compilation et exécution :

```auto
$ /usr/bin/gcc-4.1 -Wall -pthread foo.c -o foo
$ ./foo
Coucou !
$ /usr/bin/gcc-3.4 -Wall -pthread foo.c -o foo
$ ./foo
Coucou !
```

Il y a surement un problème dans un ou plusieurs fichiers de configuration de ma distribution.  
Quel que soit le source compilé, avec ou sans option -pthread, si par le jeu des includes le  
fichier pthread.h est inclus après bits/phtreadtypes.h, il y a erreur de compilation. Le  
mécanisme évitant ce conflit (que je ne connais pas) est défaillant dans ma distribution.  
Une recherche sur la toile avec “conflicting types for ‘pthread\_t’” montre que ce problème  
est souvent signalé, et reste toujours sans réponse sur le fond.

Quelqu’un aurait-il une idée ??

---

<div class="post-metadata">

**Author:** ![mattotop](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mattotop/32/3942_2.png) [@mattotop](https://www.debian-fr.org/u/mattotop)\
**Post date:** [Février 20, 2016, 3:35 UTC](https://www.debian-fr.org/t/resolu-conflit-entre-thread-h-et-pthreadtype-h/6484/5 "2016-02-20T15:35:43Z")

</div>

/usr/include/bits/pthreadtypes.h est dans le paquet libdevel/libc6-dev, d’aprés [packages.debian.org](http://packages.debian.org/cgi-bin/search_contents.pl?word=%2Fusr%2Finclude%2Fbits%2Fpthreadtypes.h&searchmode=searchfiles&case=insensitive&version=testing&arch=i386)  
par contre /usr/include/pthread.h peut aussi être dans libdevel/libpthread-dev  
si je cherche juste  
pthreadtypes.h je m’aperçois qu’il peut être présent dans 4 paquets de développements diffèrents:  
[packages.debian.org/cgi-bin/sear … earchfiles](http://packages.debian.org/cgi-bin/search_contents.pl?version=testing&arch=i386&case=insensitive&word=pthreadtypes.h&searchmode=searchfiles)  
tu es sûr d’avoir pris la bonne bibliothèque.  
Es tu à jour sur tes paquets ?

---

<div class="post-metadata">

**Author:** ![MLIBRE](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/b4bc9f/32.png) [@MLIBRE](https://www.debian-fr.org/u/MLIBRE)\
**Post date:** [Février 20, 2016, 3:35 UTC](https://www.debian-fr.org/t/resolu-conflit-entre-thread-h-et-pthreadtype-h/6484/6 "2016-02-20T15:35:44Z")

</div>

En examinant de près ta recherche, je vois que les deux includes en conflit  
proviennent tous les deux du paquet libc6-dev qui est a priori à jour dans  
mon installation. Voici mon source.list

```auto
# deb cdrom:[Debian GNU/Linux testing _Etch_ - Official Snapshot i386 DVD Binary-1 20070122-09:12]/ etch contrib main

deb http://security.debian.org/ etch/updates main contrib
deb-src http://security.debian.org/ etch/updates main contrib

deb http://ftp.fr.debian.org/debian etch main contrib non-free
deb-src http://ftp.fr.debian.org/debian etch main contrib non-free
```

et voici le résulte d’un apt-get update et de la tentative de rafraissement  
de libc6-dev.

```auto
debian:/home/michel# apt-get update
Réception de : 1 http://ftp.fr.debian.org etch Release.gpg [189B]
Atteint http://ftp.fr.debian.org etch Release
Réception de : 2 http://security.debian.org etch/updates Release.gpg [189B]
Atteint http://ftp.fr.debian.org etch/main Packages/DiffIndex
Atteint http://security.debian.org etch/updates Release
Atteint http://ftp.fr.debian.org etch/contrib Packages/DiffIndex
Ign http://security.debian.org etch/updates/main Packages/DiffIndex
Atteint http://ftp.fr.debian.org etch/non-free Packages/DiffIndex
Ign http://security.debian.org etch/updates/contrib Packages/DiffIndex
Ign http://security.debian.org etch/updates/main Sources/DiffIndex
Atteint http://ftp.fr.debian.org etch/main Sources/DiffIndex
Ign http://security.debian.org etch/updates/contrib Sources/DiffIndex
Atteint http://security.debian.org etch/updates/main Packages
Atteint http://ftp.fr.debian.org etch/contrib Sources/DiffIndex
Atteint http://security.debian.org etch/updates/contrib Packages
Atteint http://ftp.fr.debian.org etch/non-free Sources/DiffIndex
Atteint http://security.debian.org etch/updates/main Sources
Atteint http://security.debian.org etch/updates/contrib Sources
2o réceptionnés en 2s (1o/s)
Lecture des listes de paquets... Fait
debian:/home/michel# apt-get install libc6-dev
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances... Fait
libc6-dev est déjà la plus récente version disponible.
0 mis à jour, 0 nouvellement installés, 0 à enlever et 107 non mis à jour.
```

Je nage !!!

---

<div class="post-metadata">

**Author:** ![MLIBRE](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/b4bc9f/32.png) [@MLIBRE](https://www.debian-fr.org/u/MLIBRE)\
**Post date:** [Février 20, 2016, 3:35 UTC](https://www.debian-fr.org/t/resolu-conflit-entre-thread-h-et-pthreadtype-h/6484/7 "2016-02-20T15:35:46Z")

</div>

Voici un exemple simplifié à partir de exemple\_create.c de C. Blaess :

```auto
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>

void * fn_thread (void * numero);

static int compteur = 0;

int main (void)
{
pthread_t thread;
int ret;
int arg = 123;
void *retour;

 		fprintf(stdout, "Thread creation by main\n");   
		if ((ret = pthread_create (& thread, NULL, fn_thread, (void *) &arg)) != 0) 
      {
			fprintf(stderr, "Thread creation failure, ret = %d\n", ret);
			exit(1);
		}

	   while (compteur < 3) 
      {
		   fprintf(stdout, "Count in main = %d\n", compteur);
		   sleep(1);
      }   

      fprintf(stdout, "Main waits the end of the thread\n");   	   
		pthread_join(thread, &retour);

	return 0;
}

void *fn_thread (void * parg)
{
int arg = *(int *)parg;

	fprintf(stdout, "Value received by the thread from main : %d\n", arg);     
	while (compteur < 5) 
   {
		usleep(500000);
		compteur ++;
		fprintf(stdout, "Count in thread = %d\n", compteur);
	}
	fprintf(stdout, "End of the thread\n");     
	return NULL;
}
```

Compilation puis exécution :

```auto
$make exemple_create
cc -Wall -pedantic -g -pthread exemple_create.c -o exemple_create
michel@debian:~/blaess/chap12$ ./exemple_c
bash: ./exemple_c: Aucun fichier ou répertoire de ce type
$ ./exemple_create
Thread creation by main
Count in main = 0
Value received by the thread from main : 123
Count in thread = 1
Count in main = 1
Count in thread = 2
Count in thread = 3
Main waits the end of the thread
Count in thread = 4
Count in thread = 5
End of the thread
```

Je supprime la ligne #include \<pthread.h\>. La compilation marche mais l’exécution  
fait n’importe quoi (le treadh est créé mais n’est pas activé). J’arrete l’exécution  
par CTRL+C.

```auto
$make exemple_create
cc -Wall -pedantic -g -pthread exemple_create.c -o exemple_create
exemple_create.c: In function 'main':
exemple_create.c:17: attention : implicit declaration of function 'pthread_create'
exemple_create.c:26: attention : implicit declaration of function 'sleep'
exemple_create.c:30: attention : implicit declaration of function 'pthread_join'
exemple_create.c: In function 'fn_thread':
exemple_create.c:42: attention : implicit declaration of function 'usleep'
$ ./exemple_create
Thread creation by main
Count in main = 0
Count in main = 0
Count in main = 0
Count in main = 0
Count in main = 0
Count in main = 0
Count in main = 0
Count in main = 0
Count in main = 0
Count in main = 0
Count in main = 0

```

Je remet la ligne #include \<pthread.h\> et supprime la ligne #include \<stdlib.h\>.  
La compilation se fait et l’exécution est correcte :

```auto
$ make exemple_create
cc -Wall -pedantic -g -pthread exemple_create.c -o exemple_create
exemple_create.c: In function 'main':
exemple_create.c:20: attention : implicit declaration of function 'exit'
exemple_create.c:20: attention : incompatible implicit declaration of built-in function 'exit'
$ ./exemple_create
Thread creation by main
Count in main = 0
Value received by the thread from main : 123
Count in thread = 1
Count in thread = 2
Count in main = 2
Count in thread = 3
Count in thread = 4
Main waits the end of the thread
Count in thread = 5
End of the thread
```

Je supprime les deux includes (pthread.h et stdlib.h). Normal, la compilation échoue :

```auto
$ make exemple_create
cc -Wall -pedantic -g -pthread exemple_create.c -o exemple_create
exemple_create.c: In function 'main':
exemple_create.c:11: erreur: 'pthread_t' undeclared (first use in this function)
exemple_create.c:11: erreur: (Each undeclared identifier is reported only once
exemple_create.c:11: erreur: for each function it appears in.)
exemple_create.c:11: erreur: expected ';' before 'thread'
exemple_create.c:12: attention : ISO C90 forbids mixed declarations and code
exemple_create.c:17: attention : implicit declaration of function 'pthread_create'
exemple_create.c:17: erreur: 'thread' undeclared (first use in this function)
exemple_create.c:20: attention : implicit declaration of function 'exit'
exemple_create.c:20: attention : incompatible implicit declaration of built-in function 'exit'
exemple_create.c:26: attention : implicit declaration of function 'sleep'
exemple_create.c:30: attention : implicit declaration of function 'pthread_join'
exemple_create.c: In function 'fn_thread':
exemple_create.c:42: attention : implicit declaration of function 'usleep'
make: *** [exemple_create] Erreur 1
```

Et bien sur, elle échoue également avec \<stdlib.h\> avant \<pthread.h\> :

```auto
$ make exemple_create
cc -Wall -pedantic -g -pthread exemple_create.c -o exemple_create
In file included from exemple_create.c:2:
/usr/include/pthread.h:285: erreur: conflicting types for 'pthread_t'
/usr/include/bits/pthreadtypes.h:152: erreur: previous declaration of 'pthread_t' was here
/usr/include/pthread.h:286: erreur: conflicting types for 'pthread_attr_t'
/usr/include/bits/pthreadtypes.h:54: erreur: previous declaration of 'pthread_attr_t' was here
/usr/include/pthread.h:287: erreur: conflicting types for 'pthread_key_t'
/usr/include/bits/pthreadtypes.h:82: erreur: previous declaration of 'pthread_key_t' was here
/usr/include/pthread.h:289: erreur: conflicting types for 'pthread_mutexattr_t'
/usr/include/bits/pthreadtypes.h:102: erreur: previous declaration of 'pthread_mutexattr_t' was here
/usr/include/pthread.h:290: erreur: conflicting types for 'pthread_mutex_t'
/usr/include/bits/pthreadtypes.h:95: erreur: previous declaration of 'pthread_mutex_t' was here
/usr/include/pthread.h:291: erreur: conflicting types for 'pthread_condattr_t'
/usr/include/bits/pthreadtypes.h:79: erreur: previous declaration of 'pthread_condattr_t' was here
/usr/include/pthread.h:292: erreur: conflicting types for 'pthread_cond_t'
/usr/include/bits/pthreadtypes.h:72: erreur: previous declaration of 'pthread_cond_t' was here
make: *** [exemple_create] Erreur 1
```

Finalement, le code importe peu. Dans mon installation, si dans un source en langage C  
\<sys/types\> est inclut par n’importe quel autre fichier \*.h (un parmi les 106 susceptibles  
de l’inclure, qui lui meme peut etre inclut par un autre et etc…) avant \<pthread.h\>, la  
compilation échoue. Normalement \<bits/pthreadtypes.h\> n’est jamais inclut directement, cf  
l’avertissement en tete du fichier :

```auto
#if !defined _BITS_TYPES_H && !defined _PTHREAD_H
# error "Never include <bits/pthreadtypes.h> directly; use <sys/types.h> instead."
#endif
```

Il y a une solution dans le style de celle que tu proposes : inclure pthread.h dans sys/types.h  
avant qu’il inclut bits/pthreadtypes.h, mais est-ce valable pour toutes les applis ???

---

<div class="post-metadata">

**Author:** ![MLIBRE](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/b4bc9f/32.png) [@MLIBRE](https://www.debian-fr.org/u/MLIBRE)\
**Post date:** [Février 20, 2016, 3:35 UTC](https://www.debian-fr.org/t/resolu-conflit-entre-thread-h-et-pthreadtype-h/6484/8 "2016-02-20T15:35:47Z")

</div>

Encore plus simple. J’ai mis #include \<pthread.h\> à la 1ère ligne de  
bits/pthreadtypes.h, et je suis reparti dans ma tentative de compilation de la  
xine-lib. PLus de conflit entre pthread.h et pthreadtypes.h, mais un nouveau  
qui apparait plus loin, entre sys/socket.h et pthread.h :

```auto
In file included from /usr/include/sys/socket.h:27,
                 from rtsp.c:29:
/usr/include/sys/uio.h:40: error: conflicting types for '__pthread_readv'
/usr/include/pthread.h:507: error: previous declaration of '__pthread_readv' was here
/usr/include/sys/uio.h:50: error: conflicting types for '__pthread_writev'
/usr/include/pthread.h:508: error: previous declaration of '__pthread_writev' was here
In file included from rtsp.c:29:
/usr/include/sys/socket.h:124: error: conflicting types for '__pthread_connect'
/usr/include/pthread.h:501: error: previous declaration of '__pthread_connect' was here
/usr/include/sys/socket.h:152: error: conflicting types for '__pthread_sendto'
/usr/include/pthread.h:512: error: previous declaration of '__pthread_sendto' was here
/usr/include/sys/socket.h:163: error: conflicting types for '__pthread_recvfrom'
/usr/include/pthread.h:511: error: previous declaration of '__pthread_recvfrom' was here
/usr/include/sys/socket.h:210: error: conflicting types for '__pthread_accept'
/usr/include/pthread.h:502: error: previous declaration of '__pthread_accept' was here
```

J’abandonne pour le moment !!!

---

<div class="post-metadata">

**Author:** ![mattotop](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mattotop/32/3942_2.png) [@mattotop](https://www.debian-fr.org/u/mattotop)\
**Post date:** [Février 20, 2016, 3:35 UTC](https://www.debian-fr.org/t/resolu-conflit-entre-thread-h-et-pthreadtype-h/6484/9 "2016-02-20T15:35:47Z")

</div>

Ecoutes, mon fils étant en train de vandaliser le salon, j’ai un peu de mal à me concentrer sur ce que tu écris mais un truc me turlupine:  
ton problême ne peut pas être passé au travers du “filtre qualité” debian,  
je ne crois pas que ça vienne d’un problême de programmation,  
et tu as 107 paquets en instance de mise à jour.  
C’est normal ?  
Je me demande si une version ancienne d’un preprocesseur quelconque, ou une lib ancienne ?

---

<div class="post-metadata">

**Author:** ![MLIBRE](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/b4bc9f/32.png) [@MLIBRE](https://www.debian-fr.org/u/MLIBRE)\
**Post date:** [Février 20, 2016, 3:35 UTC](https://www.debian-fr.org/t/resolu-conflit-entre-thread-h-et-pthreadtype-h/6484/10 "2016-02-20T15:35:58Z")

</div>

Finalement j’ai trouvé la solution sur des forums espagnol et italien :

[mldonkey.sourceforge.net/forums/ … hp?p=25299](http://mldonkey.sourceforge.net/forums/viewtopic.php?p=25299)  
[lists.firenze.linux.it/pipermai … 14692.html](https://lists.firenze.linux.it/pipermail/tech/2006-November/014692.html)

Je ne sais pas quel package a installé libpthread-dev, mais les pthread qu’il installe sont en conflit avec le reste de la distribution. Alors je l’ai désintallé :  
$sudo apt-get remove --purge libpthread-dev  
et tout est rentré dans l’ordre. 😃
