🛠️

C言語のログ(logging:ロギング)処理(7)

1 min read

マルチスレッドでログ出力

前回までに作ったログ出力処理は、マルチスレッドで動作しても出力できるように作成しているがシングルスレッドからの出力例しか載せていなかったのでマルチスレッドからログ出力する部分を改造する。

https://zenn.dev/open_sesame/articles/864545624bcd91

TinyLogger.c にマルチスレッド処理を追加しました。
600,000件 出力できればOKで、ちゃんと出力できたのでOK牧場。

プログラミング

// TinyLogger.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <pthread.h>
#include "logger.h"

#define MAX_THREADS 10
#define MAX_CNT 10000
void thread(void);

int main(void) {

	int cnt = 0;
	pthread_t thread_id[MAX_THREADS];
	void *thread_return;

	// ログファイルのデフォルトパス
	strcpy(gIniValLog.logFilePathName, LOG_FILE_DEF_PATH);
	// ログファイルのデフォルト最大サイズ
	gIniValLog.logFileSizeMax = LOG_FILE_DEF_SIZE_MAX;
	// ログファイルのデフォルト最大世代数
	gIniValLog.logFileNumMax = LOG_FILE_DEF_NUM_MAX;

	// 10スレッド作成
	for(cnt = 0; cnt < MAX_THREADS; cnt++){
		if(pthread_create(&thread_id[cnt], NULL, (void *)thread, NULL) < 0){
			perror("pthread_create error");
			exit(1);
		}
	}

	// 10スレッド終了待ち
	for(cnt = 0; cnt < MAX_THREADS; cnt++){
		if(pthread_join(thread_id[cnt], &thread_return) < 0){
			perror("pthread_join error");
			exit(1);
		}
	}

	return EXIT_SUCCESS;
}

// スレッド
void thread(void)
{
	char buff[16];
	int cnt = 0;

	// スレッドごとに 10,000件 × 6タイプ = 60,000件
	// なかなかヘビーですな
	memset(buff, 0x0, sizeof(buff));
	for(cnt = 0; cnt < MAX_CNT; cnt++){
		sprintf(buff, "%d:%s", cnt, "main");
		LogTrace(M000001, buff);
		LogDebug(M000001, buff);
		LogInfo(M000001, buff);
		LogWarn(M000001, buff);
		LogError(M000001, buff);
		LogFatal(M000001, buff);
	}
	pthread_exit(0);
}

Discussion

ログインするとコメントできます