Cのスレッドを使った並行プログラミングについての質問です。
いわゆる生産者消費者問題(有限バッファ問題)です。

生産者スレッド
do {
pthread_mutex_lock(&lock);
share_buf_num = read(fd, prod_buf, SHARE_BUFSIZE);
strncpy(share_buf, prod_buf, share_buf_num);
pthread_mutex_unlock(&lock);
} while (share_buf_num != 0);

消費者スレッド
do {
pthread_mutex_lock(&lock);
strncpy(cons_buf, share_buf, share_buf_num);
write(fd, cons_buf, SHARE_BUFSIZE);
pthread_mutex_unlock(&lock);
} while (share_buf_num != 0); // do {

share_bufが共有バッファ、SHARE_BUFSIZEがそのサイズ
生産者でデータをリードしている間は消費者は待っており、
そのあと消費者がライトしている間は生産者が待つ
という動作を期待してるんですが、生産者のみがループし続けて
ループを抜けたあとに消費者スレッドが動くという挙動を起こします。
何が原因なのでしょうか。
gcc 4.3.2, Ubuntu8.10(仮想マシン上)です。