PDA

View Full Version : مشکل در استفاده از pthread



بهنامک‍‍
دوشنبه 29 مهر 1392, 12:15 عصر
سلام دوستان
من میخوام تو یه حلقه ۳تا thread بسازم و اونا یکی یکی بیان کار کنن و دوباره حلقه اجرا بشه اما وقتی بار اول اجرا میشن حلقه دیگه تکرار نمیشه و گیر میکنه
اینم کد :

while(loc.finish)
{
pthread_create( &thread1, pthread_attr_default,
(void *) moveH, (void *) message);
pthread_join(thread1, NULL);
sleep(2);

pthread_create( &thread2, pthread_attr_default,
(void *) moveT, (void *) message);
pthread_join(thread2, NULL);
sleep(2);
pthread_create( &thread3, pthread_attr_default,
(void *) judge, (void *) message);
pthread_join(thread3, NULL);
sleep(2);
}
به نظر شما مشکل کجاست؟

ممنون

UfnCod3r
دوشنبه 29 مهر 1392, 13:04 عصر
نفهمیدم دقیقا چی می گی:گیج:
ولی خب وقتی اینو نوشتی

pthread_join(thread1, NULL); sleep(2);

خط جاری صبر می کنه تا thread1 تموم بشه .:متفکر: نیدونم فکر کنم کارش این باشه اخه pthread یادم نی:لبخند:
باید عوض اینکه 3 تا pthread_join بزنی باید 3 تا خط رو بسازی و بعد همشونو یهو join کنی :متفکر:
تو وین با WaitForMultiObject اینکارو میشه کرد تو pthread رو نیدونم:متفکر:
:متفکر:

omidshaman
دوشنبه 29 مهر 1392, 19:42 عصر
الان این چه مدل مولتی تریدینگ کردنه Thread ها جدا جدا ران بشن بعد برنامه wait کنه تا join بشن !! خب 3 تا فانکشن کال میکردی سریع تر بود که :)
بهتره 3 تا رو همون جوری که ufn گفت با هم ران کنی .
این کد مشکلی نداره بقیه قسمتای برنامه رو هم میزاشتی
به نظر من از std::threads C++‎‎‎11 استفاده کن از pthread به مراتب ساده تر و خوانا تر ه !

بهنامک‍‍
دوشنبه 29 مهر 1392, 20:07 عصر
من دارم تو لینوکس کار میکنم.مجبورم از pthread استفاده کنم
اینم کل برنامه:
#include <stdio.h>
#include <pthread.h>
#include <ncurses.h>
#include <unistd.h>
#include <sys/types.h>

#include <stdlib.h> //exit

#ifndef pthread_attr_default /* For native POSIX threads */
#define pthread_attr_default NULL
#endif

int fd[2];

struct location {

int hx;
int hy;
int tx;
int ty;
int finish;

};

void *moveH(void *ptr)
{
struct location hloc ;
read(fd[0] , (void*)&hloc , sizeof(hloc));


if(hloc.hx == hloc.tx )
{
hloc.hx += 4;
// if(hloc.hx > 30)
// {
// hloc.hx = 0;
// hloc.hy ++;
// }

write(fd[1] , (void*)&hloc , sizeof(hloc));

clear();
move(hloc.hy,hloc.hx);
printw("H");

move(hloc.ty,hloc.tx);
printw("T");

move(0,31);
printw("|");
move(1,31);
printw("|");

refresh();
}

pthread_exit(0);
}

void *moveT(void *ptr)
{
struct location Tloc ;
read(fd[0] , (void*)&Tloc , sizeof(Tloc));


Tloc.tx += 1;
// if(Tloc.tx > 30)
// {
// Tloc.tx = 0;
// Tloc.ty ++;
// }

write(fd[1] , (void*)&Tloc , sizeof(Tloc));

clear();
move(Tloc.ty,Tloc.tx);
printw("T");

move(Tloc.hy,Tloc.hx);
printw("H");

move(0,31);
printw("|");
move(1,31);
printw("|");

refresh();

pthread_exit(0);
}

void *judge(void *ptr)
{
struct location locm ;
read(fd[0] , (void*)&locm , sizeof(locm));

if(locm.hx > 30 )
{
locm.finish = 0;
clear();
move(10,20);
printw("Hare win!!!");
refresh();
}

if(locm.tx > 30)
{
locm.finish = 0;
clear();
move(10,20);
printw("Turtle win!!!");
refresh();
}

move(14,12);
printw("judged");
refresh();


write(fd[1] , (void*)&locm , sizeof(locm));

pthread_exit(0);

}

int main()
{
initscr();

struct location loc;
loc.hx = 0;
loc.hy = 0;
loc.tx = 0;
loc.ty = 1;
loc.finish = 1;

pipe(fd);

char *message = "null";
write(fd[1] , (void*)&loc , sizeof(loc));



clear();
move(loc.ty,loc.tx);
printw("T");

move(loc.hy,loc.hx);
printw("H");

move(0,31);
printw("|");
move(1,31);
printw("|");

refresh();


pthread_t thread1, thread2 , thread3 ;

int i=5;
while(loc.finish)
{
mvaddch(i,i,(char)(i+48));refresh();
i++;
write(fd[1] , (void*)&loc , sizeof(loc));
pthread_create( &thread1, pthread_attr_default,
(void *) moveH, (void *) message);
pthread_join(thread1, NULL);
sleep(2);


pthread_create( &thread2, pthread_attr_default,
(void *) moveT, (void *) message);
pthread_join(thread2, NULL);

sleep(2);


pthread_create( &thread3, pthread_attr_default,
(void *) judge, (void *) message);
pthread_join(thread3, NULL);
sleep(2);


read(fd[0] , (void*)&loc , sizeof(loc));
// write(fd[1] , (void*)&loc , sizeof(loc));

move(16,12);
printw("%d",loc.finish);
refresh();

}

endwin();
exit (0);

}

UfnCod3r
دوشنبه 29 مهر 1392, 20:34 عصر
http://www.linuxforums.org/forum/programming-scripting/183649-waitformultipleobjects-equivalent-linux.html
مثل این که تو pthread نمشه چند تا خط رو هم زمان join کرد :متفکر:
باید خودت ی جوری پیاده سازیش کنی .:متفکر:

omidshaman
دوشنبه 29 مهر 1392, 22:19 عصر
اینجوری thread ها رو بساز ببین درست میشه

pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
pthread_create( &thread1, &attr, (void *) moveH, (void *) message);