こんにちは私は条件付き変数を使用して分離されたスレッドを同期しようとしていますが、時々メモリリークを引き起こすバグを発見しました。私はコードが自明だと思う。私は何かアドバイスをいただければ幸いです。POSIXスレッド - 条件付き変数MEMORY LEAKを使用してDETACHEDスレッドを同期する
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <unistd.h>
#include <pthread.h>
using namespace std;
struct TThrArg
{
pthread_t m_ID;
bool m_IsRunning;
};
TThrArg g_Threads[64];
int g_Counter;
pthread_mutex_t g_Mtx;
pthread_cond_t g_Cond;
void * thrFunc (void * arg)
{
TThrArg * data = (TThrArg *) arg;
// do some stuff
// -----------------------------------
// for (int i = 0; i < 5000; ++i)
// for (int j = 0; j < 5000; ++j)
// int x = 0;
// printf("Thread: %lu running...\n", data->m_ID);
// -----------------------------------
pthread_mutex_lock(&g_Mtx);
memset(data, 0, sizeof(TThrArg));
--g_Counter;
pthread_cond_signal(&g_Cond);
pthread_mutex_unlock(&g_Mtx);
sleep(1); // --> this spot causes that main may end before return NULL so resources will not be freed
return NULL;
}
void createThread (void)
{
pthread_mutex_lock(&g_Mtx);
for (int i = 0; i < 64; ++i)
{
if (g_Threads[i].m_IsRunning == 0)
{
g_Threads[i].m_IsRunning = 1;
++g_Counter;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_create(&g_Threads[i].m_ID, &attr, thrFunc, &g_Threads[i]);
pthread_attr_destroy(&attr);
break;
}
}
pthread_mutex_unlock(&g_Mtx);
}
int main (int argc, char * argv[])
{
pthread_mutex_init(&g_Mtx, NULL);
pthread_cond_init(&g_Cond, NULL);
g_Counter = 0;
for (int i = 0; i < 64; ++i)
createThread();
pthread_mutex_lock(&g_Mtx);
while (g_Counter != 0)
{
pthread_cond_wait(&g_Cond, &g_Mtx);
}
pthread_mutex_unlock(&g_Mtx);
pthread_mutex_destroy(&g_Mtx);
pthread_cond_destroy(&g_Cond);
return 0;
}
情報ありがとうございますが、上のコードを編集するだけで漏れを防ぐための「クリーンな」方法はありますか? – guderkar
スレッドによって使用されるすべてのリソースが解放されることを知る唯一の方法は、それに参加することです。スレッド内で最後に実行されたアクションとスレッドが実際に終了してそのすべてのリソースを解放したときの間に、常に競合状態が存在します。 –
ありがとうございます。 – guderkar