Wenn Sie einen bereits entsperrten Mutex entsperren, ist das Verhalten unsicher, sicher oder undefiniert?Wenn Sie einen bereits entriegelten Mutex entsperren, ist das Verhalten undefiniert?
Der Zweck der Frage bezieht sich auf den folgenden Code, wobei ich nicht weiß, ob es besser wäre, die Mutexe innerhalb des If-Blocks oder direkt außerhalb des If-Blocks zu entsperren.
// This chunk of code makes dual locking semi-autonomous.
int c_lckd = 0, q_lckd = 0;
if (pthread_mutex_trylock(&crunch_mutex) == 0) c_lckd = 1;
if (pthread_mutex_trylock(&queue_mutex) == 0) q_lckd = 1;
if (q_lckd && !c_lckd) { QUEUE_UNLOCK; q_lckd = 0; }
else if (c_lckd && !q_lckd) { CRUNCH_UNLOCK; c_lckd = 0; }
if (c_lckd && q_lckd) {
printf("cr = %d, max = %d, cnt = %d\n",
crunching, max_crunching, queue_count(conn_queue));
if (crunching < max_crunching && queue_count(conn_queue)) {
pthread_t tid =
pthread_create(
&tid,
NULL,
crunch_conn,
(void *)queue_dequeue(conn_queue)
);
crunching++;
}
CRUNCH_UNLOCK QUEUE_UNLOCK
}
Danke, Chenz
Das Ergebnis hängt vom Typ des Mutex ab, wie auf der man-Seite, deren Link du freundlicherweise zur Verfügung gestellt hast. Das Verhalten gemäß der Seite ist entweder 'nicht definiert' oder es wird ein Fehler zurückgegeben. –