C ++ : 다중 스레드 프로그램에서 파일에 쓰기

Vladislav Rakovskiy

따라서 Log :: write 메서드를 호출하여 동일한 파일에 쓰는 여러 스레드가 있습니다.

class Log
{
private:
    ofstream log;
    string file_path;
public:
    Log(string);
    void write(string);
};
Log::Log(string _file_path)
{
    file_path=_file_path;
}
void Log::write(string str)
{
    EnterCriticalSection(&CriticalSection);
    log.open(file_path.c_str(),std::ofstream::app);
    log<<str+'\n';
    log.close();
    LeaveCriticalSection(&CriticalSection);
}

스레드가 같은 객체의 Log :: write 메서드를 동시에 호출해도 안전합니까?

데이비드 하임

코드는 낭비 적이며 C ++ 관용구를 따르지 않습니다.

끝부터 시작 : 예, writewin32 CRITICAL_SECTION는 동시 수정으로부터 보호 하므로 스레드로부터 안전 합니다.

이기는 하지만:

  1. 매번 스트림을 열고 닫는 이유는 무엇입니까? 이것은 매우 낭비적인 일입니다. 생성자에서 스트림을 열고 열어 둡니다. 소멸자는 스트림 닫기를 처리합니다.

  2. Win32 중요 섹션을 사용하려면 적어도 RAII를 안전하게 만드십시오. 중요 섹션에 대한 참조를 래핑하고 생성자에서 잠그고 소멸자에서 잠금을 해제하는 클래스를 만듭니다. 이렇게하면 예외가 발생하더라도 잠금이 해제됩니다.

  3. CriticalSection어쨌든 감속은 어디 입니까? 의 구성원이어야합니다 Log.

  4. 알고 std::mutex계십니까?

  5. 값으로 문자열을 전달하는 이유는 무엇입니까? 매우 비효율적입니다. 그런 다음 const 참조로 전달하십시오.

  6. 일부 변수 ( file_path) 에는 snake_case를 사용 하고 다른 변수 에는 대문자 camel ( CriticalSection)을 사용합니다. 동일한 규칙을 사용하십시오.

  7. str문자열 변수에 대한 좋은 이름이 아니며 파일 스트림은 로그가 아닙니다. 실제 로깅을 수행하는 것입니다. logger더 나은 이름입니다. 내 수정에서 그냥 이름이 지정됩니다 m_file_stream.

수정 된 코드 :

class Log
{

private:

    std::mutex m_lock;
    std::ofstream m_file_stream;
    std::string m_file_path;

public:

    Log(const std::string& file_path);
    void write(const std::string& log);
};

Log::Log(const std::string& file_path):
   m_file_path(file_path)
{
     m_file_stream.open(m_file_path.c_str());
     if (!m_file_stream.is_open() || !m_file_stream.good())
     {
        //throw relevant exception.
     }
 }

 void Log::write(const std::string& log)
 {
    std::lock_guard<std::mutex> lock(m_lock);
    m_file_stream << log << '\n';
 }

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

동일한 텍스트 파일에 Java 다중 프로그램 쓰기

분류에서Dev

MappedFile / MappedBytes에 다중 스레드 쓰기

분류에서Dev

Java에서 다중 스레드 방식으로 여러 파일에 쓰기

분류에서Dev

다중 스레드 프로그램이 대기 상태에서 멈 춥니 다.

분류에서Dev

Java로 다중 스레드 단일 파일 쓰기

분류에서Dev

다중 스레드에 의한 C ++ 스트림에 스레드로부터 안전하게 쓰기

분류에서Dev

C에서 다중 프로세스 프로그램 디버깅

분류에서Dev

다중 스레드 응용 프로그램에 대한 Linux 장치 드라이버에서 읽기 / 쓰기 및 릴리스 처리

분류에서Dev

다중 스레드 (즉, 스레드 기반) Java 응용 프로그램에서 손상된 결과

분류에서Dev

cat, tee 및 fifos를 사용하여 다중 스레드 C 프로그램에서 xterm에서 인쇄 및 읽기

분류에서Dev

다중 스레드 C # 응용 프로그램 로그 파일 잠금 문제

분류에서Dev

python3 다중 스레딩 파일에 쓰기

분류에서Dev

C의 다른 스레드에있는 파일에서 읽기

분류에서Dev

C의 다른 스레드에있는 파일에서 읽기

분류에서Dev

NHibernate 데이터가 다중 스레드 응용 프로그램에서 동기화되지 않았습니다.

분류에서Dev

C 콘솔 프로그램에서 파일 읽기 (또는 쓰기) 오류

분류에서Dev

다중 스레드 프로그램이 C에서 어떻게 작동합니까?

분류에서Dev

다중 스레드 프로그램에서 예기치 않은 메모리 누수

분류에서Dev

다중 스레드 프로그램에서 예기치 않은 카운트 증가

분류에서Dev

간단한 C ++ 파일 읽기 프로그램은 쓰레기 만 반환합니다.

분류에서Dev

C ++ / C gz 파일을 동시에 읽는 다중 스레드

분류에서Dev

텍스트 파일 C #에 arraylist 쓰기

분류에서Dev

Visual Studio 2010 C #-파일 탐색기에서 응용 프로그램으로 저장된 파일로드

분류에서Dev

Java 프로그램에서 C : \ Program Files에 쓰기

분류에서Dev

프로세스에서 실행중인 프로그램 닫기

분류에서Dev

C ++ 다중 스레드 프로그램 : 클래스 멤버로 정의 된 변수에 대한 분할 오류

분류에서Dev

C ++로 파일에 쓰기

분류에서Dev

다중 스레드 프로그램에서 공유 리소스 업데이트

분류에서Dev

pybind11을 사용하여 다중 스레드 C ++ 프로그램에 Python 인터프리터 포함

Related 관련 기사

  1. 1

    동일한 텍스트 파일에 Java 다중 프로그램 쓰기

  2. 2

    MappedFile / MappedBytes에 다중 스레드 쓰기

  3. 3

    Java에서 다중 스레드 방식으로 여러 파일에 쓰기

  4. 4

    다중 스레드 프로그램이 대기 상태에서 멈 춥니 다.

  5. 5

    Java로 다중 스레드 단일 파일 쓰기

  6. 6

    다중 스레드에 의한 C ++ 스트림에 스레드로부터 안전하게 쓰기

  7. 7

    C에서 다중 프로세스 프로그램 디버깅

  8. 8

    다중 스레드 응용 프로그램에 대한 Linux 장치 드라이버에서 읽기 / 쓰기 및 릴리스 처리

  9. 9

    다중 스레드 (즉, 스레드 기반) Java 응용 프로그램에서 손상된 결과

  10. 10

    cat, tee 및 fifos를 사용하여 다중 스레드 C 프로그램에서 xterm에서 인쇄 및 읽기

  11. 11

    다중 스레드 C # 응용 프로그램 로그 파일 잠금 문제

  12. 12

    python3 다중 스레딩 파일에 쓰기

  13. 13

    C의 다른 스레드에있는 파일에서 읽기

  14. 14

    C의 다른 스레드에있는 파일에서 읽기

  15. 15

    NHibernate 데이터가 다중 스레드 응용 프로그램에서 동기화되지 않았습니다.

  16. 16

    C 콘솔 프로그램에서 파일 읽기 (또는 쓰기) 오류

  17. 17

    다중 스레드 프로그램이 C에서 어떻게 작동합니까?

  18. 18

    다중 스레드 프로그램에서 예기치 않은 메모리 누수

  19. 19

    다중 스레드 프로그램에서 예기치 않은 카운트 증가

  20. 20

    간단한 C ++ 파일 읽기 프로그램은 쓰레기 만 반환합니다.

  21. 21

    C ++ / C gz 파일을 동시에 읽는 다중 스레드

  22. 22

    텍스트 파일 C #에 arraylist 쓰기

  23. 23

    Visual Studio 2010 C #-파일 탐색기에서 응용 프로그램으로 저장된 파일로드

  24. 24

    Java 프로그램에서 C : \ Program Files에 쓰기

  25. 25

    프로세스에서 실행중인 프로그램 닫기

  26. 26

    C ++ 다중 스레드 프로그램 : 클래스 멤버로 정의 된 변수에 대한 분할 오류

  27. 27

    C ++로 파일에 쓰기

  28. 28

    다중 스레드 프로그램에서 공유 리소스 업데이트

  29. 29

    pybind11을 사용하여 다중 스레드 C ++ 프로그램에 Python 인터프리터 포함

뜨겁다태그

보관