Informix

 View Only

C++ SDK Thread Safe Connection

  • 1.  C++ SDK Thread Safe Connection

    Posted Tue June 25, 2024 10:16 AM

        Hi,

        I'm developing an application multi-thread that needs to connect to an Informix DB.
        I'm working with the CSDK 4.50 and c++ libraries.

        I'm encountering issues with the connection. I didn't find the way in which initialize a different connection for every thread.

        here a simple snippet of code for replicate my issues
        
        int main(int argc, char *argv[])
        {
            const constexpr int nthreads = 10;
            std::thread t[nthreads];

            for (int i = 0; i < nthreads; ++i) {
                t[i] = std::thread(printArt, conn, dbinfo, i);
            }

            for (int i = 0; i < nthreads; ++i) {
                t[i].join();
            }

            return 0;
        }

        void printArt(int i)
        {
            std::random_device rd; // obtain a random number from hardware
            std::mt19937 gen(rd()); // seed the generator
            std::uniform_int_distribution<> distr(2000, 5000); // define the range

            vector<string> result;

            ITDBInfo dbinfo;
            dbinfo.SetDatabase("eda");
            
            ITConnection conn;
            conn.Open(dbinfo)
            
            if (conn.Error()) {
                return;
            }

            conn.SetTransaction(ITConnection::Begin)
            
            ITCursor cursor(conn);
            
            if (!cursor.Prepare("select first 1 * from a_table;")) {
                conn.SetTransaction(ITConnection::ABORT);
                return;
            }

            if (!cursor.Open()) {
                conn.SetTransaction(ITConnection::ABORT);
                return;
            }

            std::this_thread::sleep_for(std::chrono::milliseconds(distr(gen)));

            ITRow* row = nullptr;
            while ((row = cursor.NextRow()) != nullptr) {
                string col0 = row->Column(0)->Printable().Data();
                string col1 = row->Column(1)->Printable().Data();

                cout << "[" << i << "] " << col0 << " | " << col1 << endl;

                row->Release();
            }

            conn.SetTransaction(ITConnection::Commit)

            conn.Close();

            return;
        }
        
        The result of this execution is undefined, sometimes it goes ahead until the end, sometimes it crash with a core dumped.
        When the program doesn't crash it seems that only one query has result and print it. The expected result is to see 1 line printed from every query (thread).

        Could anyone say me where is the mistake?

    Thanks,
    Luigi



    ------------------------------
    Luigi Roggio
    ------------------------------