在下面的代码中,两个线程正在使用相同的功能,并且每个线程应该在启动之前获取锁。因此,第一个线程获得了锁,执行了工作,然后离开,但没有释放锁,因为有意地注释掉了unlock命令。第二个线程永远不会获得锁,因此永远不会执行该作业。
我创建了这个简单的示例,只是为了测试我使用的静态代码检查器是否会标记这种情况(缺少解锁),而不会。我正在使用CodeChecker,它具有clang静态分析器和clang-tidy检查器。您是否知道会标记此内容的任何静态代码检查器?我认为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;
}