Version 1.1.5
Multithreading

WT_CONNECTION handles can be shared between threads, and applications generally only open one connection to a given database per process.

All methods on WT_CONNECTION are thread safe.

WT_SESSION and WT_CURSOR handles cannot be shared between threads concurrently: the usual approach is for applications to open one WT_SESSION for each thread that accesses a database. Applications may open multiple WT_CURSOR handles within a session.

Multiple threads must not access a session handle concurrently (including accessing two or more cursor handles in the same session). However, WT_SESSION handles may be accessed by different threads serially (for example, from a pool of threads managed by the application with a set of shared session handles). There is no thread-local state in WiredTiger, but no built-in synchronization of session state either, so if multiple threads access a session handle or dependencies such as cursors, the access must be serialized by the application.

Code samples

The code below is taken from the complete example program ex_thread.c, available in the source tree as examples/c/\1.

This is an example of a thread entry point. A new session is opened for the thread and used for all operations within that thread.

void *
scan_thread(void *arg)
{
        WT_SESSION *session;
        WT_CURSOR *cursor;
        const char *key, *value;
        int ret;

        ret = conn->open_session(conn, NULL, NULL, &session);
        ret = session->open_cursor(session, "table:access",
            NULL, NULL, &cursor);

        /* Show all records. */
        while ((ret = cursor->next(cursor)) == 0) {
                ret = cursor->get_key(cursor, &key);
                ret = cursor->get_value(cursor, &value);

                printf("Got record: %s : %s\n", key, value);
        }

        return (arg);
}

Here is the main function that starts the threads. It opens a single connection, shared between the threads, and closes the connection after waiting for all of the threads to exit.

int
main(void)
{
        WT_SESSION *session;
        WT_CURSOR *cursor;
        pthread_t threads[NUM_THREADS];
        int i, ret;

        if ((ret = wiredtiger_open(home, NULL,
            "create", &conn)) != 0)
                fprintf(stderr, "Error connecting to %s: %s\n",
                    home, wiredtiger_strerror(ret));
        /* Note: further error checking omitted for clarity. */

        ret = conn->open_session(conn, NULL, NULL, &session);
        ret = session->create(session, "table:access",
            "key_format=S,value_format=S");
        ret = session->open_cursor(session, "table:access", NULL,
            "overwrite", &cursor);
        cursor->set_key(cursor, "key1");
        cursor->set_value(cursor, "value1");
        ret = cursor->insert(cursor);
        ret = session->close(session, NULL);

        for (i = 0; i < NUM_THREADS; i++)
                ret = pthread_create(&threads[i], NULL, scan_thread, NULL);

        for (i = 0; i < NUM_THREADS; i++)
                ret = pthread_join(threads[i], NULL);

        ret = conn->close(conn, NULL);

        return (ret);
}