brpc icon indicating copy to clipboard operation
brpc copied to clipboard

依赖 brpc 作为第三方库时使用 Tsan 报错

Open MJY-HUST opened this issue 11 months ago • 1 comments

  • 项目中依赖brpc作为第三方库时出现的报错问题: brpc中的mutex.cpp覆盖了pthread_mutex_lock的实现,疑似导致tsan识别不了bthread内部实现的pthread_mutex_lock,导致出现了告警,请问有办法解决这个warning吗?一个简单的复现方式
#include <bthread/bthread.h>
#include <gflags/gflags.h>
#include <gtest/gtest.h>

namespace my::test {

class TsanCheckTest : public ::testing::Test {};

int counter;
std::mutex mutex_std;
pthread_mutex_t mu;
const int kIncrementsPerThread = 100;
void* Locker(void*) {
 for (int i = 0; i < kIncrementsPerThread; ++i) {
   pthread_mutex_lock(&mu);
   counter++;
   pthread_mutex_unlock(&mu);
 }
 return nullptr;
}

TEST_F(TsanCheckTest, MutexUsedInPthread) {
 pthread_mutex_init(&mu, nullptr);
 const int num_threads = 8;
 pthread_t th[num_threads];

 counter = 0;
 for (int i = 0; i < num_threads; ++i) {
   ASSERT_EQ(0, pthread_create(&th[i], nullptr, Locker, nullptr));
 }
 for (int i = 0; i < num_threads; ++i) {
   ASSERT_EQ(0, pthread_join(th[i], nullptr));
 }
 ASSERT_EQ(counter, num_threads * kIncrementsPerThread);
}

TEST_F(TsanCheckTest, MutexUsedInBthread) {
 const int num_threads = 8;
 bthread_t th[num_threads];

 counter = 0;
 for (int i = 0; i < num_threads; ++i) {
   ASSERT_EQ(0, bthread_start_urgent(&th[i], nullptr, Locker, nullptr));
 }
 for (int i = 0; i < num_threads; ++i) {
   ASSERT_EQ(0, bthread_join(th[i], nullptr));
 }
 ASSERT_EQ(counter, num_threads * kIncrementsPerThread);
}

}  // namespace my::test

image

MJY-HUST avatar Jan 07 '25 11:01 MJY-HUST

#2727 加了一个宏(NO_PTHREAD_MUTEX_HOOK)用来关掉hook。

但是bthread lock和FastPthreadLock没有适配TSan,可能会导致误报。应该得适配了TSan、ASan注解才可以正常工作吧。

chenBright avatar Jan 09 '25 07:01 chenBright