その処理ってのは多重ロックの実装で、ロックカウンタを操作するのに排他が必要で、それに mutex を使ってる。
ロックを獲得する関数を呼んだならば、それを解放する処理も必ず呼ばなくちゃいけない。
だからその解放処理をクリーンアップハンドラに指定するんだけど、その解放処理自身も mutex を使ってるから、
mutex の解放を確実にするため、pthread_mutex_unlock もクリーンアップハンドラにしたい。
処理を単純化して書くと、こんなかんじ。

void my_lock(void *my_resource)
{
 pthread_cleanup_push(pthread_mutex_unlock, &mtx);
 pthread_mutex_lock(&mtx);
 ロック処理
 pthread_cleanup_pop(1);
}

void my_unlock(void *my_resource)
{
 pthread_cleanup_push(pthread_mutex_unlock, &mtx);
 pthread_mutex_lock(&mtx);
 アンロック処理
 pthread_cleanup_pop(1);
}

で、

 pthread_cleanup_push(my_unlock, &my_resource);
my_lock(&my_resource);
 なんらかの処理
 pthread_cleanup_pop(1);

というわけ。
そんなにおかしなことしてる?