アプリケーションで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;
}