Bonjour, j'ai fait un petit programme en C avec une boucle par thread, le problème c'est que ça ne fonctionne que avec codeblocks sous windows mais pas sous linux:
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
using namespace std;
void * HighSpeedFonction(pthread_mutex_t mutex) //fonction thread
{
int i=0;
pthread_mutex_lock(&mutex);//lock l autre thread
while(i<5000){
printf("thread HS %d\n",i);
i++;
}
pthread_mutex_unlock(&mutex);//libere le mutex
pthread_exit(NULL);
}
int main() //thread principal
{
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;//declaration et initialisation d'un mutex qui permet de mettre en pause un thread temps que l'autre ne unlock pas le mutex
pthread_t HS; //variable de type pthread_t
pthread_create(&HS, NULL, HighSpeedFonction, mutex); //fonction qui cree un thread (&variable thread, NULL, pointeur fonction a executer, arg de la fonct)
sleep(10);//laisse le temps a HS de le se lancer en premier
pthread_mutex_lock(&mutex);
int i=0;
while(i<5000){
printf("thread LS %d\n",i);
i++;
}
pthread_mutex_unlock(&mutex);
printf("thread main\n");
return 0;
}
pour le compiler je fais g++ threads.cpp -o threads -lpthread
et j'ai les erreurs:
error: invalid conversion from ‘void* (*)(pthread_mutex_t)’ to ‘void* (*)(void*)’
error: cannot convert ‘pthread_mutex_t’ to ‘void*’
qui pointent respectivement sur HighSpeedFonction et mutex à la ligne 26
Tu n'as rien mis de propre au C++ dans ton code que tu ne puisses retirer (includes non utilisés). Le message premier dit "C", et effectivement tu n'utilises que des éléments de la bibliothèques standard du C et de la lib POSIX, qui est celle avec laquelle tu as des soucis.
Et concernant la partie MT de la lib POSIX..., en C++, nous préférerons utiliser maintenant (2011 +) les threads standards -> std::threads. Les mutex se verront encapsulés dans des std::lock_guards qui garantissent le déverrouillage -- on ne veut plus voir de unlock() écrits à la main.
Autre langage, autre philosophie.
Bref, je ne sais pas pourquoi le message a été déplacé côté C++. Ou alors si tu compiles vraiment en C++ et que tu soit prêt à une petit remise en question de ton approche, soit le bien venu!
Tu n'as rien mis de propre au C++ dans ton code que tu ne puisses retirer (includes non utilisés). Le message premier dit "C", et effectivement tu n'utilises que des éléments de la bibliothèques standard du C et de la lib POSIX, qui est celle avec laquelle tu as des soucis.
Et concernant la partie MT de la lib POSIX..., en C++, nous préférerons utiliser maintenant (2011 +) les threads standards -> std::threads. Les mutex se verront encapsulés dans des std::lock_guards qui garantissent le déverrouillage -- on ne veut plus voir de unlock() écrits à la main.
Autre langage, autre philosophie.
Bref, je ne sais pas pourquoi le message a été déplacé côté C++. Ou alors si tu compiles vraiment en C++ et que tu soit prêt à une petit remise en question de ton approche, soit le bien venu!
- Edité par lmghs il y a 17 minutes
C'est du C++ en effet, visiblement j'ai encore suivi des tutos qui sont dépasser, je viens de tomber sur un cours qui me propose une toute autre façon de procéder et qui utilise ces mêmes threads standards:
#include <iostream>
#include <thread>
using namespace std;
void f(int x){
cout<<"Un thread C++\n" << x << endl;
}
int main(){
thread t(f,20);
t.join();
return 0;
}
c'est sur la bonne voie?
j'ai vérifier mon compilateur (mingw gcc) et il utilise bien thread model: posix
(je suis encore débutant donc j'ai du mal et mes profs de BTS n'ont jamais survolé les threads en 2 ans)
Si tu veux progresser de la bonne manière en C++ "moderne" vas plutôt lire le cours de C++ sur www.zestedesavoir.com il te donnera des bases solides. Evite par contre celui sur ce site, le cours est antédiluvien et tu apprendras des notions dépassées qui font que quand tu commenceras un projet sa maintenabilité sera moindre par exemple (il y a plein d' autres raisons , je vais pas toutes les énumerer).
Tu n'as rien mis de propre au C++ dans ton code que tu ne puisses retirer (includes non utilisés). Le message premier dit "C", et effectivement tu n'utilises que des éléments de la bibliothèques standard du C et de la lib POSIX, qui est celle avec laquelle tu as des soucis.
Et concernant la partie MT de la lib POSIX..., en C++, nous préférerons utiliser maintenant (2011 +) les threads standards -> std::threads. Les mutex se verront encapsulés dans des std::lock_guards qui garantissent le déverrouillage -- on ne veut plus voir de unlock() écrits à la main.
Autre langage, autre philosophie.
Bref, je ne sais pas pourquoi le message a été déplacé côté C++. Ou alors si tu compiles vraiment en C++ et que tu soit prêt à une petit remise en question de ton approche, soit le bien venu!
- Edité par lmghs il y a 17 minutes
C'est du C++ en effet, visiblement j'ai encore suivi des tutos qui sont dépasser, je viens de tomber sur un cours qui me propose une toute autre façon de procéder et qui utilise ces mêmes threads standards:
#include <iostream>
#include <thread>
using namespace std;
void f(int x){
cout<<"Un thread C++\n" << x << endl;
}
int main(){
thread t(f,20);
t.join();
return 0;
}
c'est sur la bonne voie?
j'ai vérifier mon compilateur (mingw gcc) et il utilise bien thread model: posix
(je suis encore débutant donc j'ai du mal et mes profs de BTS n'ont jamais survolé les threads en 2 ans)
Oui, c'est ça. On va dire que c'est le Hello World de la programmation concurrente.
Tu as un livre qui fait un peu référence: C++ Concurrency in Action, de Anthony Williams. C'est déjà pour des programmeurs avancés.
threads qui ne fonctionne pas sous linux
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Mon site web de jeux SDL2 entre autres : https://www.ant01.fr