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);
}
|
阅读(1504) | 评论(0) | 转发(0) |