3

在下面的代码中,两个线程正在使用相同的函数,并且每个线程都应该在开始之前获取锁。所以第一个线程获得锁,完成工作,然后离开,但没有释放锁,因为解锁命令被故意注释掉了。第二个线程永远不会获得锁,因此永远不会完成这项工作。

我创建了这个简单的示例只是为了测试我正在使用的静态代码检查器是否会标记这种情况(缺少解锁),但事实并非如此。我正在使用具有 clang 静态分析器和 clang-tidy 检查器的CodeChecker 。你知道任何会标记这个的静态代码检查器吗?我认为 Coverity 可能,但我没有证明它的许可证。

#include<stdio.h>
#include<string.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>

pthread_t tid[2];
int counter;
pthread_mutex_t lock;

void* doSomeThing() {
    pthread_mutex_lock(&lock);

    unsigned long i = 0;
    counter += 1;
    printf("\n Job %d started\n", counter);

    for(i=0; i<(0xFFFFFFF);i++);

    printf("\n Job %d finished\n", counter);

    // pthread_mutex_unlock(&lock);

    return NULL;
}

int main(void) {
    int i = 0;
    int err;

    if (pthread_mutex_init(&lock, NULL) != 0) {
        printf("\n mutex init failed\n");
        return 1;
    }

    while(i < 2) {
        err = pthread_create(&(tid[i]), NULL, &doSomeThing, NULL);
        if (err != 0)
            printf("\ncan't create thread :[%s]", strerror(err));
        i++;
    }

    pthread_join(tid[0], NULL);
    pthread_join(tid[1], NULL);
    pthread_mutex_destroy(&lock);

    return 0;
}
4

1 回答 1

1

Coverity 可以通过选项显示信号量锁定/解锁组合的缺陷--concurrency

有关其他详细信息,请参阅本文

于 2018-12-13T09:44:32.113 回答