我是线程新手。我想让两个线程xthread
打印'X';并ythread
打印“Z”;连续直到用户插入'C'
或'c'
在stdin
。我已经使用 select 来检查是否有任何用户输入。如果有用户输入,我会使用scanf
它来获取它read
并进行比较。
我一直保持read
全球性。[有没有其他方法可以在线程之间共享非全局数据?] . 我假设,当用户'c'
在 stdin 输入时,当前正在运行的线程读取它并将其存储在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
是否可以解决我的问题。我没有发现使用互斥锁的必要性。[如果我错了请纠正我]