2011-03-24 3 views
4

아래의 링크에 따르면, 나는 작은 테스트 케이스를 썼다. 그러나 그것은 효과가 없습니다. 어떤 생각이라도 감사드립니다!scoped_lock이 파일에서 작동하지 않습니까?

참조 : http://www.cppprog.com/boost_doc/doc/html/interprocess/synchronization_mechanisms.html#interprocess.synchronization_mechanisms.file_lock.file_lock_careful_iostream

#include <iostream> 
#include <fstream> 

#include <boost/interprocess/sync/file_lock.hpp> 
#include <boost/interprocess/sync/scoped_lock.hpp> 

using namespace std; 
using namespace boost::interprocess; 

int main() 
{ 
    ofstream file_out("fileLock.txt"); 
    file_lock f_lock("fileLock.txt"); 

    { 
     scoped_lock<file_lock> e_lock(f_lock); // it works if I comment this out 
     file_out << 10; 
     file_out.flush(); 
     file_out.close(); 
    } 

    return 0; 
} 
+0

"작동하지 않음"을 정의하십시오. 컴파일러 오류가 발생합니까? 런타임시 어설 션? 예상치 못한 동작입니까? 세부 사항을 알려주세요. – ildjarn

+0

컴파일되지만 런타임 중에는 fileLock.txt에 쓰지 않습니다. – echo

+1

VC++ 2010 SP1에서이를 재현하고 1.46.1을 향상시킬 수 있습니다. 문서의 정확한 샘플 코드가 작동하지 않는다면 버그가있는 것으로 보일 수 있으므로 사용자 메일 링리스트에 게시해야합니다. – ildjarn

답변

4

리눅스에서 테스트를 실행하여 원하는 출력을 생성합니다.

참조하는 페이지에 다음과 같은 경고가 표시됩니다. "해당 파일에서 파일 잠금을 사용하는 동안 std :: fstream/네이티브 파일 핸들을 사용하여 파일에 쓰려면이 경고를 닫지 마십시오. 파일의 모든 잠금을 해제하기 전에 파일을. "

Boost::file_lock은 분명히 Windows에서 LockFileEx을 사용합니다. MSDN 다음과 같이 말합니다. "잠금 프로세스가 파일을 다시 열면 영역을 잠금 해제 할 때까지이 두 번째 핸들을 통해 지정된 영역에 액세스 할 수 없습니다."

적어도 Windows에서는 파일 잠금이 파일 단위가 아닌 핸들 단위 인 것으로 보입니다. 내가 말할 수있는 바로는 프로그램이 Windows에서 작동하지 않을 수 있음을 의미합니다.

+0

모든 답변 주셔서 감사합니다. 나중에 사용자 메일 링리스트를 향상시키기 위해 게시 할 것입니다. 이 테스트 케이스에 대한 새로운 아이디어가 있다면 의견을 말하십시오. – echo

0

다음은 Boost 1.44를 기반으로 파일 잠금을 사용하여 파일에 추가하는 일시적인 해결책입니다.

#include "boost/format.hpp" 
#include "boost/interprocess/detail/os_file_functions.hpp" 

namespace ip = boost::interprocess; 
namespace ipc = boost::interprocess::detail; 

void fileLocking_withHandle() 
{ 
    static const string filename = "fileLocking_withHandle.txt"; 

    // Get file handle 
    boost::interprocess::file_handle_t pFile = ipc::create_or_open_file(filename.c_str(), ip::read_write); 
    if ((pFile == 0 || pFile == ipc::invalid_file())) 
    { 
    throw runtime_error(boost::str(boost::format("File Writer fail to open output file: %1%") % filename).c_str()); 
    } 

    // Lock file 
    ipc::acquire_file_lock(pFile); 

    // Move writing pointer to the end of the file 
    ipc::set_file_pointer(pFile, 0, ip::file_end); 

    // Write in file 
    ipc::write_file(pFile, (const void*)("bla"), 3); 

    // Unlock file 
    ipc::release_file_lock(pFile); 

    // Close file 
    ipc::close_file(pFile); 
} 
관련 문제