На просторах интернетов нашел информацию, что pthread_mutex_t нельзя перемещать в памяти, когда он используется. Но у меня не получается это воспроизвести
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main ()
{
pthread_mutex_t * mutex_1 = malloc ( sizeof ( pthread_mutex_t ) );
pthread_mutex_t * mutex_2 = malloc ( sizeof ( pthread_mutex_t ) );
pthread_mutex_t * mutex_3 = malloc ( sizeof ( pthread_mutex_t ) );
if ( mutex_1 == NULL || mutex_2 == NULL || mutex_3 == NULL || pthread_mutex_init ( mutex_1, NULL ) != 0 ) {
free ( mutex_1 ); free ( mutex_2 ); free ( mutex_3 );
return 1;
}
memmove ( mutex_2, mutex_1, sizeof ( pthread_mutex_t ) );
if ( pthread_mutex_lock ( mutex_2 ) != 0 ) {
free ( mutex_1 ); free ( mutex_2 ); free ( mutex_3 );
return 2;
}
memmove ( mutex_3, mutex_2, sizeof ( pthread_mutex_t ) );
if ( pthread_mutex_unlock ( mutex_3 ) != 0 || pthread_mutex_destroy ( mutex_3 ) != 0 ) {
free ( mutex_1 ); free ( mutex_2 ); free ( mutex_3 );
return 3;
}
free ( mutex_1 ); free ( mutex_2 ); free ( mutex_3 );
return 0;
}
gcc -O0 -g -std=gnu99 main.c -o main && ./main ; echo $?
>> 0
clang -O0 -g -std=c99 -fsanitize=thread -fno-omit-frame-pointer main.c -o main && ./main ; echo $?
>>
ThreadSanitizer WARNING: unlock of unlocked mutex 0x7d0c0000ef70
#0 pthread_mutex_unlock <null>:0 (main+0x00000006321c)
#1 main /home/puchuu/temp/main.c:24 (main+0x0000000a04f5)
0
Где найти конкретную информацию почему нельзя перемещать мьютекс? А можно ли перемещать спинлоки и семафоры?
ЗЫ точное воспроизведение неспособности мьютекса быть перемещенным - очень важно. Программа проверки может отдать сборочной системе флаг типа MUTEX_NOT_MOVABLE и программист может принять решение о костыле.