C言語で複数スレッドからファイルアクセスする場合、ロックする関数についてご教示ください。

下記のようなプログラムを作成しています。

・スレッド(1)は、ファイルに対してライトします。
・スレッド(2)は、スレッド(1)によってライトされたファイルに対してリードします。
・必ずしもスレッド(1)(2)は同じファイルにアクセスするわけではなく、スレッドごとにfopen()します。
・タイミングによってスレッド(1)(2)は同じファイルにアクセスします。

・(不測の自体でロックをとったままスレッドが落ちてしまった場合、他方のスレッド側ロックを強制解除して処理は継続させたいです(別途エラーメッセージはログに出力します)。

flock(fd,LOCK_EX)をつかってロックを取る方針で検討していたのですが、
「flock()はファイル記述子ごとにロックするので、
fopen()を別々に行っていては正しくロックできないのでは?」
との指摘を受けて、ロックのとり方を再検討している最中です。