2011-11-07 3 views
12

나는 여러 스레드에서 여러 파일을 쓰고 싶은 C#에서 Windows 응용 프로그램을 만들고 있습니다. 다른 포트에서 데이터를 가져 오는 중이며 모든 포트와 관련된 파일이 하나 있습니다. 모든 포트에 대해 스레드 생성이 가능합니다. 각각의 파일에 데이터를 쓰는 데 동일한 스레드를 반복해서 사용합니까? 포트 100001000110002에서 데이터를 가져 오는 중이며 10000.txt, 10001.txt 및 10002.txt와 같은 세 개의 파일이 있다고 가정합니다. 이 세 파일에 각각 데이터를 쓰는 데 쓰레드 세 개를 만들어야하고이 쓰레드를 반복해서 사용하고 싶습니다. 가능합니까? 가능한 경우 작은 샘플 코드를 제공 할 수 있습니까?여러 스레드로 단일 파일을 작성하는 방법은 무엇입니까?

+4

파일 액세스를 직렬화하거나 (예 : 뮤텍스 또는 이와 유사한 방식으로) 하나의 중앙 스레드가 파일을 쓰도록해야합니다. 다른 모든 스레드가 무엇을 쓸 것인지를 말합니다 (중앙 스레드가 수행 할 작업 대기열에 넣기).) ... – Yahia

+3

왜 여러 스레드에서 하나의 파일에 쓸 필요가 있습니까? 이는 동기화뿐만 아니라 파일 작성 (잠금 등)의 메커니즘까지도 나쁜 아이디어입니다. – Oded

+0

여기에 내가 다른 포트에서 지속적으로 데이터를 가져오고 거기에 다른 files.Three 하나의 포트와 관련된 하나의 파일입니다. 나는 각 파일에 해당 포트에서 오는 데이터를 쓰고 싶습니다. 나는 모든 들어오는 데이터에 대한 스레드를 만들고 싶어, 그것 해당 데이터를 특정 파일에 쓰고 중단합니다. – Dany

답변

10

주석에서 언급했듯이, 이것은 문제를 요구하고 있습니다.

public class FileWriter 
{ 
    private ReaderWriterLockSlim lock_ = new ReaderWriterLockSlim(); 
    public void WriteData(/*....whatever */) 
    { 
     lock_.EnterWriteLock(); 
     try 
     { 
      // write your data here 
     } 
     finally 
     { 
      lock_.ExitWriteLock(); 
     } 
    } 

} // eo class FileWriter 

이 많은 스레드에 의해 호출되는 적합 :

그래서, 당신은 스레드 안전 작가 클래스가 있어야합니다. 하지만 경고가 있습니다. 자물쇠 경합이있을 수 있습니다. ReadWriterLockSlim 클래스를 사용했기 때문에 읽기 잠금을 수행하고 싶을 수도 있고 지옥 클래스를 사용하면 읽기 상태에서도 업그레이드 할 수 있습니다.

+0

응답 주셔서 감사합니다, 나는 파일에 쓰기위한 단 하나의 방법을 작성하고 그 method.But에 대한 다른 매개 변수를 전달하는 나는 쓰기 메서드를 누른 다음 단 하나의 스레드가 해당 메서드에 액세스 할 수있는 잠금을 사용합니다. 이것은 어떤 사용하지 않습니다 나를. – Dany

+0

@Dany, 여러 스레드 + 1 파일 = 나쁜 소식. 당신의 유스 케이스는 무엇입니까? –

+0

여러 스레드와 +1 파일이 내 사례가 아닙니다. 내 사례는 여러 스레드와 여러 파일입니다. – Dany

0

스레드를 직렬화하고 닫고 열기 파일 호출을 관리해야합니다. 쓰기 대신에 append를 사용하십시오. (다른 스레드와 마찬가지로) 스레드 관리자 클래스를 사용하여 다른 모든 스레드를 동기화 할 수 있습니다. 아마도 가장 좋은 것은 파일에 쓰는 데 쓰이는 하나의 쓰레드를 사용하는 것이지만 ..

+0

응답 해 주셔서 감사합니다. 그러나 특정 파일 하나에 대해 하나의 전용 스레드를 만들 수 있습니까? 다른 파일을위한 스레드 등등? – Dany

+0

@Dany - 항상 같은 스레드를 실행중인 스레드가 없다면 어떤 파일에 대해서도 writting을 처리 할 것입니다.허용 된 대답조차도 파일에 쓰는 새 스레드를 생성하지 않고 여러 스레드가 sametime에서 동일한 파일로 쓰기를 막지 않도록합니다. –

3

다른 게시물에 대한 답변은 원래 질문과 다소 일치하지 않습니다. 스레드 당 하나의 다른 파일에 글을 쓰고 싶습니다.

쉬운 대답은 .. 그냥 해보세요. 파일 시스템은 스레드로부터 안전합니다. 유일한 장애물은 하나의 디스크로 성능이있을 수 있습니다. 작은 파일을 여러 파일에 동시에 빠르게 작성하면 파일 시스템이 하나의 로터 암만있는 분산 파일/디렉토리를 처리 할 때 많은 디스크 스 래싱이 발생할 수 있습니다. 대형 캐시 및 영리한 컨트롤러가있는 최신 하드 디스크는 어느 정도 이것을 완화 할 수 있지만 문제가있을 수 있습니다. 그것을 시도하고 볼!

지속적으로 스레드를 만들고 파괴하고 들어오는 모든 네트워크 읽기에 대한 데이터 파일을 열고 닫으려는 경우 문제가 증가합니다. 이것을 피할 수 있다면 그렇게하십시오.

디스크가 유지할 수없는 경우 디스크 쓰기 크기를 늘리고 숫자를 줄이거 나 SSD를 구매하거나 두 가지 모두를 수행 할 수있는 독창적 인 '지연 기록'알고리즘을 구현할 수 있습니다.

관련 문제