藍森林首頁 | 返回主頁 | 本站地圖 | 站內搜索 | 聯繫信箱 |
 您目前的位置:首頁 > 自由軟件 > 技術交流 > 應用編程


    

藍森林 http://www.lslnet.com 2006年6月6日 10:18


2個問題熟悉線程和proc*c編程的朋友幫看看..

1.程序功能:
同時創建n 個線程連接n個數據庫,這n個數據庫的連接信息(如用戶口令等等)在創建線程之前倒入到一個單向鏈表中.所以多個線程訪問這個鏈表的節點的過程中需要同步,不過我訪問的節點數據都是亂碼,問題在那裡呢?大家看看.....
2.另外:pro*c程序中是否需要#include <pthread.h>;的頭文件,我沒有包括都可以編譯通過,但包含之後便宜卻包錯,不知道預編譯的時候oracle是否已經包含了線成的頭文件了呢?我的系統是aix4.3.4 ,ibm c編譯器.
代碼如下:
int main(int argc , char *argv[])
{       
        long iNodeCount = 0 , iRet = 0;
       
             iRet = pthread_mutex_init(&mutex_locklist , NULL);
             if (iRet != 0) {
                     perror("pthread_mutex_init error!\n");
                     exit(-1);
             }
             iNodeCount = LoadConnInfo();//將連接信息裝入鏈表
             CreateThread(iNodeCount); //創建線成
        ClearList(ptrhead);//刪除鏈表
            
        exit(0);
}

void CreateThread(long count)
{
        pthread_t thread;
        void *thread_result;
        struct ConnInfo *ptrthread = 0;
        long int i = 0 , iRet = 0;
       
        ptrthread = ptrhead;//全局變量,鏈表的頭指針
             for (i = 0 ; i < count ; i++) {
                     /*printf("data=%s,log=%s\n" , ptrthread->;sDataFileName , ptrthread->;sLogFileName);                            */                   
                    if (pthread_create(&thread , NULL , ThrdCreateData , (void *)&ptrthread)) {
                        perror("create thread error!\n");
                        exit(-1);
                }
                iRet = pthread_join(thread , &thread_result);
                if (iRet != 0) {
                        perror("thread join failed!\n");
                        exit(-2);
                }
                ptrthread = ptrthread->;next;               
            }           
}

void *ThrdCreateData(void *arg)
{
         struct ConnInfo *node;
         
         EXEC SQL BEGIN DECLARE SECTION;
                 long i = 0;
         EXEC SQL END DECLARE SECTION;
         
         /*pthread_detach(pthread_seld());*/         
         pthread_mutex_lock(&mutex_locklist);
         node = (struct ConnInfo *)arg;
         printf("data=%s,log=%s\n" , node->;sDataFileName , node->;sLogFileName);//這裡打印的數據都是錯誤的,但在進入線成函數之前的數據就都是正確的!
         pthread_mutex_unlock(&mutex_locklist);
         pthread_mutex_destroy(&mutex_locklist);          
         /*EXEC SQL CONNECT :node->;sConnStr;  
           if (sqlca.sqlcode != 0) {
                   printf("連接數據庫失敗,詳細原因:%s , code = %d\n" , sqlca.sqlerrm.sqlerrmc , sqlca.sqlcode);
                   pthread_exit(NULL);                    
           }*/           
           
         /*EXEC SQL Select count(*) Into i From tab;*/       
}

2個問題熟悉線程和proc*c編程的朋友幫看看..

up

2個問題熟悉線程和proc*c編程的朋友幫看看..

1
PRO*C是不是支持多線程,如果不支持多線程那麼就會有問題
2
要include 什麼頭文件是看看你的.c文件中有沒有調用這個頭文件內定義的函數
就是說include只影響編譯時不影響連接時
如果不include也可以編譯通過(注意也不要有某函數未定義的warnning,不然後面link時會err)那麼就不用include了

2個問題熟悉線程和proc*c編程的朋友幫看看..

關注



Copyright © 1999-2000 LSLNET.COM. All rights reserved. 藍森林網站 版權所有。 E-mail : webmaster@lslnet.com