diff --git a/src/perf_events.cpp b/src/perf_events.cpp index 94403821ed9f88ce1bf95838ccda314a0dc50e62..f822526694f3f72a16a1481516736465577cdc80 100644 --- a/src/perf_events.cpp +++ b/src/perf_events.cpp @@ -588,7 +588,11 @@ void PerfEvents::ExitReadRecordBufThread() __sync_synchronize(); cvRecordBuf_.notify_one(); } - readRecordBufThread_.join(); + if (readRecordBufThread_.get_id() != std::this_thread::get_id()) { + readRecordBufThread_.join(); + } else { + readRecordBufThread_.detach(); + } } } diff --git a/test/unittest/common/native/perf_events_test.cpp b/test/unittest/common/native/perf_events_test.cpp index e12fef48e86e9ec4324ed17fd15a8b041ef80e80..59b06c058ce24fdedad2ab809bffc5f6ea6260a8 100644 --- a/test/unittest/common/native/perf_events_test.cpp +++ b/test/unittest/common/native/perf_events_test.cpp @@ -324,6 +324,29 @@ HWTEST_F(PerfEventsTest, StatNormal, TestSize.Level1) std::string stringOut = stdoutRecord.Stop(); } + +HWTEST_F(PerfEventsTest, ExitReadRecordBufThread, TestSize.Level1) +{ + std::atomic count = 0; + std::thread t1([&count]() { + PerfEvents* event = new PerfEvents(); + event->cpuMmap_ = {}; + event->isLowPriorityThread_ = false; + + auto func = [event, &count]() { + std::this_thread::sleep_for(std::chrono::milliseconds(1000)); + delete event; + count++; + }; + event->readRecordBufThread_ = std::thread(func); + std::this_thread::sleep_for(std::chrono::milliseconds(2000)); + count++; + }); + t1.detach(); + + std::this_thread::sleep_for(std::chrono::milliseconds(3000)); + EXPECT_EQ(count, 2); +} } // namespace HiPerf } // namespace Developtools } // namespace OHOS