반응형

C++ 에서 사용하는 Mutex 로 제공하는데, 사용할 때마다 사용 예제를 한번씩 살펴보게 되어 정리해 보았습니다.

std::lock_guard는 C++에서 여러 스레드가 공유하는 리소스에 대한 동기화를 쉽게 관리할 수 있게 해주는 클래스입니다. std::lock_guard는 생성될 때 mutex를 잠그고, 범위를 벗어나면 자동으로 mutex를 해제하여, 수동으로 잠금을 관리할 필요가 없게 만들어줍니다.

다음은 std::lock_guard를 사용한 예제입니다:

 
예제 코드

 

 

코드 상세 설명

  1. Mutex 선언 (std::mutex mtx;)
    mtx는 std::mutex 타입의 객체로, 프로그램 내에서 공유 자원을 안전하게 보호하기 위한 목적으로 사용됩니다. 이 mtx 객체는 잠금(Lock)과 해제(Unlock) 기능을 제공하여 하나의 스레드만 특정 코드 구간에 접근하도록 보장합니다.
  2. std::lock_guard 선언 (std::lock_guard<std::mutex> lock(mtx);)
    • std::lock_guard는 lock 객체가 생성되면서 mtx를 잠급니다. 이로 인해 다른 스레드가 print_numbers 함수에서 mtx를 사용하려고 하면, lock이 해제될 때까지 기다리게 됩니다.
    • lock은 print_numbers 함수가 끝날 때(즉, 스코프를 벗어날 때) 자동으로 소멸됩니다. std::lock_guard의 소멸자(destructor)가 호출되면서 mtx가 자동으로 해제됩니다. 이를 통해 우리가 직접 mtx.unlock()를 호출할 필요가 없어, 코드가 간결해지고 오류를 줄일 수 있습니다.
  3. 스레드 생성 (std::thread t1(print_numbers, 1); std::thread t2(print_numbers, 2);)
    • std::thread를 이용해 두 개의 스레드 t1과 t2를 생성합니다.
    • 각 스레드는 print_numbers 함수의 복사본을 실행하며, id 매개변수를 통해 구분됩니다(첫 번째 스레드는 id가 1이고, 두 번째 스레드는 2).
  4. 출력
    • 두 스레드가 실행되면, std::cout으로 1부터 5까지의 숫자를 출력하게 됩니다.
    • 스레드가 공유 자원인 std::cout에 접근할 때 std::lock_guard가 mtx를 잠그므로, 한 스레드가 std::cout을 통해 출력 중이면 다른 스레드는 대기합니다.
    • 만약 std::lock_guard가 없었다면, 두 스레드가 동시에 std::cout에 접근할 수 있어 출력이 섞이거나 예기치 못한 결과가 발생할 수 있습니다.
  5. 스레드 종료 대기 (t1.join(); t2.join();)
    • t1.join()과 t2.join()은 main 함수가 두 스레드가 끝날 때까지 기다리도록 합니다.
    • join을 호출하지 않으면, main 함수가 스레드가 끝나기 전에 종료될 수 있습니다.

 

std::lock_guard가 필요한 이유

  • 안전한 동시성 보장: std::lock_guard는 스레드가 공유 자원에 접근할 때, 다른 스레드가 해당 자원에 접근하지 못하게 막아줍니다. 이를 통해 스레드 간 충돌을 방지하고 데이터 무결성을 유지합니다.
  • 자동 해제: std::lock_guard는 스코프를 벗어날 때 자동으로 mutex를 해제하므로, 실수로 unlock을 호출하지 않거나, 예외 상황에서 해제를 누락하는 등의 문제를 예방합니다.

이 예제에서는 print_numbers 함수 내의 std::cout 출력을 동기화해, 두 스레드의 출력이 섞이지 않도록 보장하고 있습니다.

반응형

std::vector는 C++ 표준 라이브러리에서 제공하는 동적 배열 클래스입니다. 크기가 가변적이며, 요소 추가 및 삭제 시 자동으로 크기를 조정합니다. std::vector는 내부적으로 연속적인 메모리 블록에 데이터를 저장하므로, 요소에 대한 임의 접근이 빠릅니다.

 

주요 특징

  1. 동적 크기 조정: 필요에 따라 크기를 자동으로 조정합니다.
  2. 임의 접근: 배열처럼 인덱스를 사용하여 요소에 빠르게 접근할 수 있습니다.
  3. 메모리 관리: 메모리 할당 및 해제를 자동으로 처리합니다.
  4. 유연한 사용: 다양한 편의 메서드(push_back, pop_back 등)를 제공하여 사용이 간편합니다.

 

예제

 

 

주요 메서드

  • push_back(value): 벡터 끝에 요소를 추가합니다.
  • pop_back(): 벡터 끝의 요소를 제거합니다.
  • size(): 벡터의 현재 크기를 반환합니다.
  • capacity(): 벡터가 메모리를 재할당하지 않고 저장할 수 있는 최대 요소 수를 반환합니다.
  • empty(): 벡터가 비어 있는지 확인합니다.
  • clear(): 벡터의 모든 요소를 제거합니다.
  • at(index): 인덱스를 사용하여 요소에 접근합니다(범위 검사 포함).

 

장점

  • 배열과 달리 크기를 미리 알 필요가 없습니다.
  • 메모리 관리를 신경 쓸 필요가 없습니다.

 

단점

  • 메모리 재할당 시 성능이 저하될 수 있습니다.
  • 배열보다 메모리 오버헤드가 더 클 수 있습니다.

std::vector는 C++에서 유용하고 많이 사용되는 컨테이너로, 대부분의 상황에서 배열보다 더 유연하게 사용할 수 있습니다.

반응형

라인 드로우를 구현할때, openGL, DX, winDC 등을 사용할 수 없는경우,

바닥부터 맨땅에 코딩을 해야하는 경우가 생기더라.

그때를 위한 참고용 코드.

 

Void DrawLine(int x1, int y1, int x2, int y2)
{
    int aX=0, aY=0;
    int cnt = 0;
    int dx = x2-x1;
    int dy = y2-y1;

    if(dx < 0) {addX = -1; dx = -dx;}
    else addX = 1;
    if(dy < 0) {addY = -1; dy = -dy;}
    else addY = 1;
    
    int x = x1;
    int y = y1;
    if(dx >= dy)
    {
        for(int i = 0 ; i < dx ; i++)
        {
            x += addX;
            cnt += dy;
            if(cnt >= dx)
            {
                y += addY; cnt -= dx;
            }
            drawPoint(x,y);
        }
    }
    else
    {
        for(int i = 0 ; i < dy ; i++)
        {
            y+= addY;
            cnt += dx;
            if(cnt >= dy)
            {
                x += addX; cnt -= dy;
            }
            darwPoint(x,y);
        }
    }
}

 

 

반응형

Ctrl+G

반응형

C언어의 대표적 함수 scanf 의 함수는 다음과 같은 형태를 가지고 있다.


int scanf (const char * format, ...);


사용 예는 다음과 같다.


scanf("%d", &input);


위 글은 숫자형을 입력받을때 사용하는 방식이다.


Visual Studio 2008 기준 전체 코드를 간단히 짜보면  다음과 같다.


#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])

{

int input;

scanf("%d", &input);

printf("%d\n", input);

return 0;

}


숫자값을 입력받고, 숫자값을 출력하는 코드이다.
실행시켜보면 다음과 같이 표출되는것을 확인할 수 있다.






반응형

C 언어에서 Bit 단위로 변수를 지정하고 싶은 경우, Bit Field 라는 기능을 사용한다


기본적인 선언 방법은 다음과 같다.


struct bitField {

BYTE bit1:1;

BYTE bit2:1;

BYTE bit3:1;

BYTE bit4:1;

BYTE bit5:1;

BYTE bit6:1;

}


이와 같이 선언하면 1Byte 에 6개의 변수로 각각 1bit 까지의 데이터를 사용할 수 있다.

1bit 이므로, 0과 1만 입력이 가능하며, 2를 입력하게 되면 앞 비트를 침범하게 된다.


bitField.bit1 = 2; 


이와 같이 데이터값을 셋팅하면, 2의 binary 값은 10 이므로 bitField.bit1 는 0, bitFile.bit2 는 1이 셋팅되게 된다.


bit 단위로 데이터를 저장하거나,  bit 단위의 프로토콜 데이터를 사용하면 상당히 유용한 기능이다.

나는 bit 단위로 정보를 잘라서 전송해야 하는 CAN 프로토콜 사용시 유용하게 사용하였다.


비트필드의 선언 변수형은 C 언어의 모든 변수형이 사용이 가능하며, unsigned 형 변수로 사용하지 않는다면 상당한 주의가 필요하다. 



'Computer Programming > C,C++,MFC' 카테고리의 다른 글

[C]LineDraw - 브레젠험 알고리즘  (0) 2021.06.29
[C/C++] C언어 입력함수 scanf  (0) 2017.02.15
[C/C++] fopen 함수의 옵션값 정리  (0) 2016.11.10
[C/C++] bsearch 함수  (0) 2016.06.22
[MFC]CString <-> Char* 변환  (0) 2013.11.08
반응형

사용자의 접속 IP를 확인하는 경우, 기본적으로 다음 코드를 이용하여 사용한다

 

$ip = $_SERVER['REMOTE_ADDR'];

ip, web header, port 등과같이 웹에서 사용하는 기본적인 정보들은 PHP의 "$_SERVER" API 에서 가져올 수 있다.다음은 "$_SERVER" 함수 로 가져올 수 있는 목록이다.

 

 

$_SERVER['DOCUMENT_ROOT'] = 현재 사이트가 위치한 서버상의 위치
$_SERVER['HTTP_ACCEPT_ENCODING'] = 인코딩 방식
$_SERVER['HTTP_ACCEPT_LANGUAGE'] = 언어
$_SERVER['HTTP_USER_AGENT'] = 사이트 접속한 사용자 환경
$_SERVER['REMOTE_ADDR'] = 사이트 접속한 사용자 IP
$_SERVER['SCRIPT_FILENAME'] = 실행되고 있는 위치와 파일명
$_SERVER['SERVER_NAME'] = 사이트 도메인
$_SERVER['SERVER_PORT'] = 사이트가 사용하는 포트
$_SERVER['SERVER_SOFTWARE'] = 서버의 소프트웨어 환경
$_SERVER['GATEWAY_INTERFACE'] = CGI 정보
$_SERVER['SERVER_PROTOCOL'] = 사용된 서버 프로토콜
$_SERVER['REQUEST_URI'] = 현재페이지의 주소에서 도메인 제외
$_SERVER['PHP_SELF'] = 현재페이지의 주소에서 도메인과 넘겨지는 값 제외
$_SERVER['APPL_PHYSICAL_PATH'] = 현재페이지의 실제 파일 주소

 

반응형

fopen 함수를 종종 쓸일이 생기는데, 매번쓰는 옵션값 외에는 헷갈리기에 정리해 보았다.


fopen 함수는 파일 입출력을 위한 함수로 다음과 같이 사용할 수 있다.


FILE *fp = NULL;

//우선 파일 포인터로 사용할 변수를 선언하고, 
//경로와 모드값으로 파일을 오픈한뒤 파일포인터에 넣는다.
//fopen 함수의 형태는 다음과 같다.

//FILE *fopen(const char *filename, const char *mode);

fp = fopen("test.txt", "wb");

그리고 위에 fopen Mode 값으로 사용할 수 있는 값들은 다음과 같다.


r : Open for reading only. (읽기 전용)


w : Create for writing. If a file by that name already exists, it will be overwritten.

    (쓰기용으로 파일생성, 동일이름이 있다면 덮어씀.)


a : Append; open for writing at end-of-file or create for writing if the file does not exist.

    (동일명 파일 존재시 끝에 이어씀, 동일명 파일 없으면 쓰기용 파일 생성)


r+ : Open an existing file for update (reading and writing).

    (현재 있는 파일에 read/write 모두 덮어씀.)


w+ : Create a new file for update (reading and writing). 

      If a file by that name already exists, it will be overwritten.

    (읽기/쓰기용으로 파일 생성. 같은 파일 존재시 덮어)


a+ : Open for append; open (or create if the file does not exist) for update at the end of the file.

    (파일이있으면 뒤에 추가, 업다면 새로 생성)


t : Text Mode (텍스트 모드)


b : Binary Mode (이진 파일 모드)



'Computer Programming > C,C++,MFC' 카테고리의 다른 글

[C/C++] C언어 입력함수 scanf  (0) 2017.02.15
[C/C++] Bit Field, 비트 변수 ':'  (0) 2017.02.13
[C/C++] bsearch 함수  (0) 2016.06.22
[MFC]CString <-> Char* 변환  (0) 2013.11.08
[C/C++]OpenSSL Library 사용을 위해  (0) 2013.10.15
반응형

맥의 기본 설정 마우스 휠 스크롤은 Winodws 와 반대로 되어 있다.


맥에서는 설정에서 마우스 휠 방향을 설정할 수 있다.


방법은 다음과 같다.


> 시스템 환경설정 - 마우스

> 스크롤 방향 : 자연스럽게를 해제한다.


이렇게 하면 윈도우와 같은 방향의 휠 스크롤을 사용할 수 있다.

반응형

PHP의 변수는 숫자나 문자를 담아두는 곳이라 생각하면 된다.

다른 언어와 달리 식별자(int, char....) 없이 바로 사용할 수 있다.


다음 예제는 변수를 연산하고 출력하는 예제이다. 


<html>

<body>

<?php

$a=1;              //변수 $a에 1을 넣는다.

echo $a+1;       //$a에 1을 더하여 출력한다.

echo "<br />";  //다음줄로 간다.

$a=2;              //변수 $a에 2를 넣는다.

print $a+1;      //$a에 1을 더하여 출력한다.

echo "<br />";  //다음줄로 간다.

$b=1;             //$b에 1을넣는다.

$a = $a+$b;     //$a와 $b를 더하여 $a 에 넣는다.

echo $a;          //$a를 출력한다.

?>

</body>

</html>


//는 주석으로 //뒤에 나오는 내용은 프로그램으로 인식하지 않는다.

부연설명이라고 생각하면 된다.


위와 같이 $a 변수에 숫자를 넣어 연산에 사용할 수 있다.

+ Recent posts