Chinaunix首页 | 论坛 | 博客
  • 博客访问: 532503
  • 博文数量: 150
  • 博客积分: 5010
  • 博客等级: 大校
  • 技术积分: 1861
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-17 00:19
文章分类

全部博文(150)

文章存档

2011年(1)

2009年(14)

2008年(135)

我的朋友

分类: LINUX

2009-03-04 17:45:09

3.4号:

改进函数:通过修改  

typedef struct op_thread{
TC_OPCODE_T tc_opcode;
pthread_t thread_id;
}OP_THREAD;

/*global variable for tcmd application */
typedef struct testCmdGlobal
{
    TC_MODE_T tc_current_mode;
    
    /*TC_MOTFAC, TC_MOTLAN, TC_MOTPST, TC_MOTCDC, TC_MOTDSP*/
    INT32 usb_interface; 
    
    INT32 exitFlag;
    INT32 mux_fd;
    INT32 bt_socket_fd;
    INT32 usb_dev_fd;
    INT32 emud_fd;
    pthread_mutex_t mux_mutex,timer_mutex;
    
    INT32 connected_socks[DEFAULT_BACKLOG];
    INT32 connect_num;
    INT32 open_mux;
 /*for cancel thread*/
 OP_THREAD op_thread[DEFAULT_NUM];//max is 50

 //pthread_t thread_id[DEFAULT_NUM];//max is 50

 INT32 thread_num;
/*Start: add pipe fd for bp read handler*/
    INT32 pipe_rd_fd;
    INT32 pipe_wrt_fd;
/*End****/ 
} TC_GLOBAL_T;

 

   1

   可以取消某一个opcode所对应的正在执行的线程 ,或者取消在之前开启的正在执行的所有的线程,无论是同一个连接,还是之前连接所开启的线程。

  2

   通过当op_thread数组中超过某个数量值时才清除数组中的方法,解决了不同的连接可以取消别的连接所开启的线程,这是因为一个连接所开启的Item Handler线程并末结束时,并没有在这个连接结束时清除op_thread数组,而是把其线程号与opcode 保存在了里面

  3

 在Borqs_TCMD_channel_api()函数中,采用pthread_detach()解决了Item Handle所对应的执行线程的异步问题,从而使得并不是pthread_join()使此函数也阻塞,从而不能让ExecutionThreadHandler并发的接收opcode数据,执行程序

4

  了解一个数据结构的唯护:如方法是定义了
定义:

typedef struct op_thread{
TC_OPCODE_T tc_opcode;
pthread_t thread_id;}
OP_THREAD;

OP_THREAD op_thread[DEFAULT_NUM];//max is 50

INT32 thread_num;


对于这个数据结构的唯护:


     a 增加:执行线程创建时,对于这个结构数组 

  

TCMD_TRACE("api--- create tc_ctrlthread_tcmd_handler_exec thread sucess :thread_id= 0x%x \n ", thread_id);
  i = g_tcmd_vars.thread_num;
 g_tcmd_vars.op_thread[i ].thread_id=thread_id;
 g_tcmd_vars.op_thread[i].tc_opcode=tcmd->cmd_header.opcode;
 g_tcmd_vars.thread_num++;


b:减少:当一个执行线程结束时,从此数组op_thread[DEFAULT_NUM]中去掉它:代码


/*reset pthread_id array for avoiding pthread_id array is full ,recycle self thread id*/
 for(i=0 ; i<g_tcmd_vars.thread_num; i++ )
 {
  
   if (g_tcmd_vars.op_thread[i].thread_id == thread_id)
   {
   TCMD_TRACE("Self to recycle g_tcmd_vars.op_thread[%d]: tc_opcode= 0x%04x thread_id=0x%x in g_tcmd_vars.op_thread[] array \n ", i, g_tcmd_vars.op_thread[i].tc_opcode, g_tcmd_vars.op_thread[i].thread_id);
                  
   g_tcmd_vars.op_thread[i].thread_id = g_tcmd_vars.op_thread[ --g_tcmd_vars.thread_num].thread_id;
   g_tcmd_vars.op_thread[i].tc_opcode = g_tcmd_vars.op_thread[ g_tcmd_vars.thread_num].tc_opcode;
   TCMD_TRACE("now g_tcmd_vars.op_thread[%d] : tc_opcode= 0x%04x thread_id = 0x%04x in g_tcmd_vars.op_thread[] array \n ", i, g_tcmd_vars.op_thread[i].tc_opcode, g_tcmd_vars.op_thread[i].thread_id);
   break;
   }
  
  }


c:清除:
在连接线程执行完以后,对于这个连接中并末结束的线程号在数组op_thread[DEFAULT_NUM],此时并没有把此数组清0,而是保留,当这个数组达到DEFAULT_NUM时,再清除这个数组,从而使得另外的连接线程
也能访问这个op_thread[DEFAULT_NUM]数组,从而能取消pthread_cancel()掉别的连接所建立的线程。这个在末修改前是每个连接在结束时,都清除这个数组,从而不能使别的连接线程清除别的连接线程所建立的执行线程号,这是因为op_thread[DEFAULT_NUM]清除后,下一个连接访问的是这个清除后的数组。

/* reset thread_id array when g_tcmd_vars.thread_num >=50 */
    if( g_tcmd_vars.thread_num > DEFAULT_NUM )
    {
       TCMD_TRACE("when g_tcmd_vars.thread_num > %d clear thread id array\n", DEFAULT_NUM);
       for (i = 0; i < g_tcmd_vars.thread_num; i++)
       {
        g_tcmd_vars.op_thread[i].thread_id = 0;                
        }
       g_tcmd_vars.thread_num = 0;
    }
    else
    {
       TCMD_TRACE(" g_tcmd_vars.op_thread[] array :g_tcmd_vars.thread_num =%d (< DEFAULT_NUM=50)\n", g_tcmd_vars.thread_num);
    }
    

阅读(1465) | 评论(0) | 转发(0) |
0

上一篇:并没有并行(梁总提示)

下一篇:除法

给主人留下些什么吧!~~