使用互斥信号量,两个线程分别向同一份文件中有序地写入A和B,希望结果为BABABABA...,我这样为什么不对

设置了两个互斥信号量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);
}

https://wenku.baidu.com/view/985881e328ea81c759f57817.html