私はスレッドが初めてです。xthread
2 つのスレッドに 'X' を出力させたい。そしてythread
「Z」を出力します。'C'
ユーザーがまたは'c'
at を挿入するまで継続しstdin
ます。select を使用して、ユーザー入力があるかどうかを確認しました。ユーザー入力がある場合は、それscanf
を取得しread
て比較を行います。
私はread
グローバルのままにしています。[スレッド間で非グローバル データを共有する他の方法はありますか? ] . 'c'
ユーザーが標準入力に入力すると、現在実行中のスレッドがそれを読み取り、に保存すると仮定しましたread and breaks out
。フラグread_input
を使用して、入力が既に取得されており、ユーザー入力を再度取得する必要がないことを他のスレッドに示しました。
問題:
ユーザーが入力'c'
xthread 終了 [または ythread]
ただし、ythread はループし続け、'c'
再度入力した後にのみ終了します。[私の推測では、以前の値を読み取り、read
比較のために同じ値を使用しています]
私は何を間違えましたか?
#include<stdio.h>
#include<sys/select.h>
#include<pthread.h>
static unsigned int i =0;
char read;
int read_input = 0;
void* print_fn(void* arg)
{
int fd = fileno(stdin);
struct timeval tv = {0,0};
fd_set fdset;
int s;
char *buffer = NULL;
unsigned int len;
while(1)
{
struct timespec t = {0,433300000};
const struct timespec * tp = &t;
nanosleep(tp,&t);
printf("\nValue of read is %d",read);
//sleep(1);
FD_ZERO(&fdset);
FD_SET(fd, &fdset);
printf("\n%p prints %c and i is %d",pthread_self(),*((char*)arg),i++);
if((s = select(fd+1, &fdset, NULL, NULL, &tv)) == 1)
{
printf("\nValue of s is %d",s);
if(!read_input)
scanf("%c",&read);
fflush(stdin);
printf("\nValue of read is %d",read);
printf("\nChecked for %d or % d",'C','c');
if(read == 'C' || read == 'c')
{
read_input = 1;
break;
}
}
printf("\nHere");
}
printf("\nI, %p survived while(1)",pthread_self());
return NULL;
}
int main()
{
pthread_t xthread,ythread,checkThread;
char c1 = 'X', c2 = 'Z';
pthread_create(&xthread,NULL,print_fn,&c1);
pthread_create(&ythread,NULL,print_fn,&c2);
pthread_join(xthread,NULL);
pthread_join(ythread,NULL);
return 0;
}
ユーザー入力を取得するより良い方法がある場合は、お知らせください。pthread_cond_t
を使用することで問題が解決するかどうかはわかりません。ミューテックスを使用する必要はありません。【間違っていたら訂正】