#define _MULTI_THREADED // using kernel thread #include#include #include #include //pthread_cond_t cond = PTHREAD_COND_INITIALIZER; pthread_cond_t cond; pthread_mutex_t mutex; void *thread_f(void *param) { int ret; while(1){ ret = pthread_mutex_lock(&mutex); printf("Thread is Waiting.....\n"); ret = pthread_cond_wait(&cond, &mutex); printf("Thread is Running\n"); ret = pthread_mutex_unlock(&mutex); } } int main(int argc, char **argv) { pthread_cond_init(&cond, NULL);/// pthread_create를 호출하기 전에, cond과mutex를 초기화 해야 된다 pthread_mutex_init(&mutex, NULL); pthread_t pth; int ret; ret = pthread_create(&pth, NULL, thread_f, NULL); printf("pthread_create\n"); sleep(5); // pthread_cond_init(&cond, NULL); // pthread_mutex_init(&mutex, NULL); for(int i=0; i<5 0="" a="" ake="" cond="" exit="" i="" mutex="" n="" pre="" printf="" pthread_cond_destroy="" pthread_mutex_destroy="" ret="pthread_mutex_unlock(&mutex);" return="" sleep="" thread...="" up="" work="">5>
sqlite는 embedded system에서 널리 사용되는 무료 dbms?(dbms라고 말하긴 좀 그렇지만, dbms라 불러주자 ㅎ) 이다. 특히 memory db 기능이 아주 유용하다. 그 밖의 dbms에서도 이 기능이 있으나, 이 기능이 지원되는 버전은 대부분 고가이다. 따라서, 무료인 sqlite를 많이들 애용하는 것 같다. 멀티쓰레드를 sqlite DB를 구현하고 롱런테스트를 하다보면, pthread_mutex_lock으로 쓰레드 간의 교착상태를 막아줘도, sqlite lock 에러가 간헐적으로 발생할 것이다. 이에 대해 본인은 다음과 같은 에러 처리 구문을 준비하여 사용하고 있다. sqlite Error가 발생하면, sqlite3_exception함수를 호출한다. 이 함수에서 sqlite error code를 구분하여, 만약, busy 또는 locked이면 최대 2초간 sleep 상태로 만드는 sqlite3_busy_timeout, busy handler를 호출한다. 그 다음, goto 구문으로 재차 sqlite3_exec를 실행한다. 단, sqlite3_exec는 transaction의 begin과 commit 또는 rollback 구문 사이에서 실행한다. 대부분 lock 에러가 발생하더라도 1~2번 실패 후에, 처리된다는 것이 본인의 테스트 결과이다. 단, journal를 WAL로 변경하였음. 기존 journal은 멀티쓰레드 지향적이지 않다는 점을 잊지마시길.... Error Code SQLITE_LOCKED (6): Database Is Locked This error code occurs when you try to do two incompatible things with a database at the same time from the same database connection. For example, if you are in the middle of a SELECT statement and y...
Comments