设置了两个互斥信号量mutex1和mutex2,分别初始化为1。线程1等待mutex2信号量(即等待线程2将其唤醒),然后往文件中写入A,接着把刚写进去的字符发送到服务器端,操作完成以后唤醒线程2。线程2等待mutex1信号量(即等待线程1将其唤醒),然后往文件中写入B,接着把刚写进去的字符发送到服务器端,操作完成以后唤醒线程1。听起来有毛病么?然而实际上本地的文件是BABABABAABABABBA...这种样子,也就是说有些地方出现了两个连续的A,或者两个连续的B,这是为什么呢?线程1写了A以后不是被阻塞了么?怎么能够连着写两个A的呢?
线程1
void *pthread1(void *arg)
{
int sock_cli = *(int *)arg;
char *buffer = "A";
while(1){
sem_wait(&mutex2);//等待线程2将其唤醒
int fd = open(FILE_NAME, O_RDWR | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR);
if(fd == -1) {
printf("error is %s\n", strerror(errno));
exit(-1);
}
write(fd, buffer, strlen(buffer));
send(sock_cli, buffer, strlen(buffer),0);
printf("send %s\n",buffer);
close(fd);
sem_post(&mutex1);//唤醒线程2
sleep(2);
}
close(sock_cli);
}
线程2
void *pthread2(void *arg)
{
int sock_cli = *(int *)arg;
char *buffer = "B";
while(1){
sem_wait(&mutex1);//等待线程1将其唤醒
int fd = open(FILE_NAME, O_RDWR | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR);
if(fd == -1) {
printf("error is %s\n", strerror(errno));
exit(-1);
}
write(fd, buffer, strlen(buffer));
send(sock_cli, buffer, strlen(buffer),0);
printf("send %s\n",buffer);
close(fd);
sem_post(&mutex2);//唤醒线程1
sleep(2);
}
close(sock_cli);
}