并发访问pthread_mutex_t pthread_mutex_lock时出错。c:62:uu pthread_mutex_lock:断言'mutex->__数据。所有者==0';失败

并发访问pthread_mutex_t pthread_mutex_lock时出错。c:62:uu pthread_mutex_lock:断言'mutex->__数据。所有者==0';失败,c,linux,multithreading,pthreads,C,Linux,Multithreading,Pthreads,为什么我会收到这个错误 这个程序是为了重现我在其他程序中收到的错误 此程序的唯一任务是并发锁定和解锁pthread\u mutex\t #include <pthread.h> #include <stdio.h> #include <stdbool.h> #ifndef TREADSXXX #define TREADSXXX 100 #endif #ifndef TREADSXXX_TO_UNLOCK #define TREADSXXX_TO_UNLOC

为什么我会收到这个错误

这个程序是为了重现我在其他程序中收到的错误

此程序的唯一任务是并发锁定和解锁pthread\u mutex\t

#include <pthread.h>
#include <stdio.h>
#include <stdbool.h>

#ifndef TREADSXXX
#define TREADSXXX 100
#endif

#ifndef TREADSXXX_TO_UNLOCK
#define TREADSXXX_TO_UNLOCK 25
#endif

#ifndef TREADSXXX_TO_LOCK
#define TREADSXXX_TO_LOCK 4
#endif

#ifndef SEEDXXX
#define SEEDXXX 0
#endif

void *threadF(void *nada);

pthread_mutex_t stop[TREADSXXX];

pthread_mutex_t numberAsignation;

pthread_mutex_t waintNumberAsignation;

pthread_t idTread[TREADSXXX];

unsigned int counterT=0;

int main(void){
    unsigned int localCounter;
    srand(SEEDXXX);
    pthread_mutex_init(&numberAsignation, NULL);
    pthread_mutex_init(&waintNumberAsignation, NULL);
    for(localCounter=0; localCounter<TREADSXXX; localCounter++)
        pthread_mutex_init(stop+localCounter, NULL);
    pthread_mutex_lock(&waintNumberAsignation);
    for(localCounter=0; localCounter<TREADSXXX; localCounter++)
        pthread_create(idTread+localCounter, NULL, threadF, NULL);
    while(getchar()!='X');
}

void *threadF(void *nada){
    unsigned int nunmber, localCounter, aux;
    pthread_mutex_lock(&numberAsignation);
    nunmber=counterT;
    counterT++;
    pthread_mutex_unlock(&numberAsignation);
    if(nunmber<TREADSXXX-1)
        pthread_mutex_lock(&waintNumberAsignation);
        pthread_mutex_unlock(&waintNumberAsignation);
    while(true){
        for(localCounter=0; localCounter<TREADSXXX_TO_UNLOCK; localCounter++){
            pthread_mutex_unlock(stop+(rand()%TREADSXXX));
        }
        for(localCounter=0; localCounter<TREADSXXX_TO_LOCK; localCounter++){
            pthread_mutex_lock(stop+(rand()%TREADSXXX));
        }
    }
}
#包括
#包括
#包括
#ifndef TREADSXXX
#定义TREADSXXX 100
#恩迪夫
#ifndef踏板Xxx\u至\u解锁
#定义踏板Xxx_至_解锁25
#恩迪夫
#ifndef踏板Xxx\u至\u锁
#定义踏板Xxx_至_锁4
#恩迪夫
#ifndef SEEDXXX
#定义0
#恩迪夫
void*threadF(void*nada);
pthread_mutex_t stop[TREADSXXX];
pthread_mutex_t numberAsignation;
pthread_mutex_t waintnumberassignation;
pthread_t idTread[TREADSXXX];
无符号整数计数器t=0;
内部主(空){
无符号整数本地计数器;
srand(SEEDXXX);
pthread_mutex_init(&numberSignation,NULL);
pthread_mutex_init(&waintnumberassignation,NULL);

对于(localCounter=0;localCounter您不能释放不持有的互斥锁。

线程函数调用随机互斥锁的
pthread\u mutex\u unlock
,该互斥锁可能不由它持有


锁定和解锁必须对称进行。获取一个锁,做你需要的,在同一线程中释放它。

你不能释放一个你不持有的互斥锁。

线程函数调用随机互斥锁的
pthread\u mutex\u unlock
,该互斥锁可能不由它持有


锁定和解锁必须对称进行。拿一把锁,做你需要的,在同一个线程中释放它。

除了断裂的随机锁定和解锁之外,还有一些其他问题:

风格问题:如果你 使用数组索引而不是指针算法:

for(localCounter=0; localCounter<TREADSXXX; localCounter++)
    pthread_mutex_init(stop+localCounter, NULL);
pthread_mutex_lock(&waintNumberAsignation);
for(localCounter=0; localCounter<TREADSXXX; localCounter++)
    pthread_create(idTread+localCounter, NULL, threadF, NULL);

对于(localCounter=0;localCounter以及中断的随机锁定和解锁,还有一些其他问题:

风格问题:如果你 使用数组索引而不是指针算法:

for(localCounter=0; localCounter<TREADSXXX; localCounter++)
    pthread_mutex_init(stop+localCounter, NULL);
pthread_mutex_lock(&waintNumberAsignation);
for(localCounter=0; localCounter<TREADSXXX; localCounter++)
    pthread_create(idTread+localCounter, NULL, threadF, NULL);

for(localCounter=0;localCounter)您的示例代码没有多大意义。在不知道是否拥有随机互斥体的情况下解锁这些互斥体是不可能工作的。我拥有所有这些互斥体,因为我创建了一个互斥体数组,并且在示例代码中锁定和解锁的所有互斥体都在数组的边界内。“拥有”这并不意味着它们在进程的内存中,这意味着执行解锁的线程与执行锁定的线程相同。在当前线程未锁定的互斥体上,不能调用
unlock
,这是未定义的行为。示例代码没有太多意义。在不知道是否我拥有所有的互斥体,因为我创建了一个互斥体数组,而我在示例代码中锁定和解锁的所有互斥体都在数组的边界内。“own”这并不意味着它们在进程的内存中,而是意味着执行解锁的线程与执行锁定的线程相同。在当前线程未锁定的互斥锁上,不能调用
unlock
,这是未定义的行为。
stop+localcounter
&stop[localcounter]相同
,不管大小(pthread\u mutex\u t)
。后者更清楚。另外,我猜另一个问题不是布局不好,而是缺少大括号(他是说两者都在
下,如果
@ugoren你是绝对正确的-我错了。我会编辑我的答案,将其改为风格建议。我想我忘了a[b]可以写为b[a]。
stop+localcounter
和stop[localcounter]
相同,不管
sizeof(pthread\u mutex\u t)
。后者更清楚。另外,我想另一个问题不是布局不好,而是缺少大括号(他的意思是如果
@ugoren你是绝对正确的,那么这两个答案都在
下-我错了。我会编辑我的答案,将其改为风格推荐。我想我忘了a[b]可以写成b[a]。
for(localCounter=0; localCounter<TREADSXXX; localCounter++)
    pthread_mutex_init(&stop[localCounter], NULL);
pthread_mutex_lock(&waintNumberAsignation);
for(localCounter=0; localCounter<TREADSXXX; localCounter++)
    pthread_create(&idTread[localCounter], NULL, threadF, NULL);
if(nunmber<TREADSXXX-1)
    pthread_mutex_lock(&waintNumberAsignation);
    pthread_mutex_unlock(&waintNumberAsignation);
if(nunmber<TREADSXXX-1)
{
   pthread_mutex_lock(&waintNumberAsignation);
}
pthread_mutex_unlock(&waintNumberAsignation);