0

アプリケーションでNSPR スレッドを使用しています。私は50のスレッドを作成しています。各スレッドは SQLite データベースを開き、クエリを実行します。

関数 BusyHandler (以下のプログラム内) は、2 つのスレッドが同時にクエリを実行するときに呼び出されます。BusyHandler 関数内でスレッド ID を取得するにはどうすればよいですか?

サンプル プログラム:

#define THREADCOUNT 50

static int BusyHandler(void * pArg, int pTries);

void CreateThreads()
{
    int i = 0;
    PRThread *thread[THREADCOUNT];

    for(i = 0; i<THREADCOUNT;i++)
    {
        waitobj[i] = new WaitObj();
        thread[i] = PR_CreateThread(PR_USER_THREAD, StartThread, (void *)i, PR_PRIORITY_NORMAL, PR_GLOBAL_THREAD, PR_JOINABLE_THREAD, 0);
    }

    Sleep(20000);
    for(i = 0; i<THREADCOUNT;)
    {     
       waitobj[i]->Signal();
       PR_JoinThread(thread[i]);    
       i = i+1;
    }
}
void StartThread(void *Arg)
{ 
    char *errmsg;
    const char *err;
    const char *unused;
    int ret;

    int index = (int)Arg;
    sqlite3 *sqlite;

    const char *dir = "test.sqlite";
    ret = sqlite3_open(dir, &sqlite);
    sqlite3_busy_handler(sqlite, BusyHandler, sqlite);

    char query[100];
    sqlite3_stmt *stmt;

    strcpy(query, "insert into table1 values(1,2,3,4,5)");
    ret = ExecuteQuery(sqlite, query);
    if(ret != SQLITE_OK && ret != SQLITE_DONE )
    {       
        return;
    }
    Sleep(10000);   
}

int BusyHandler(void * pSQLite, int pTries)
{
    sqlite3 * sqlite = (sqlite3 *)pSQLite; 
    Sleep(1000);

    if(pTries >= 10) // now return BUSY
        return 0;

    // check whether lock is removed!
    return 1;
}
4

0 に答える 0