暂时标记


#include <unistd.h>
#include <pthread.h>
#include <stdio.h>


pthread_key_t key;

void *thread_fun1(void *arg)
{
	printf("thread 1 start!\n");
	int a = 1;
	pthread_setspecific(key, (void *)a);
	sleep(2);
	printf("thread 1 key->data is %d\n", pthread_getspecfic(key));
}

void *thread_fun2(void *arg)
{
	printf("thread 2 start!\n");
	int a = 2;
	pthread_setspecific(key, (void *)a);
	printf("thread 2 key->data is %d\n", pthread_getspecfic(key));
}

int main()
{
	pthred_t tid1, tid2;

	pthread_key_create(&key, NULL);
	if(pthread_create(&tid1, NULL, thread_fun1, NULL))
	{
		printf("crerate new thread 1 fail\n");
		return 0;
	}
	if(pthread_create(&tid2, NULL, thread_fun2, NULL))
	{
		printf("crerate new thread 2 fail\n");
		return 0;
	}

}

 

分析一下以下代码的作用 IOT_MODEL_INTERNAL_USE HPR_BOOL ParseBinaryData(HPR_UINT32 dwType, BINARY_DATA_TABLE* pTable, BINARY_DATA_REFERENCE *pTagInfo, NET_COMMAND_WRAP* pStruData) { if (pTagInfo == NULL) return HPR_FALSE; // 是否已经获取过tag信息 HPR_BOOL bHasGetTag = ((pTagInfo->byExisted) ? HPR_TRUE : HPR_FALSE); HPR_UINT16 wIdx = 0; HPR_UINT16 wArrayIdx = 0; BINARY_PARSING_STATE eParsingState = kParsingKnownTag; BINARY_DATA_CURSOR tmpDataCursor = { 0 }; while (pTable->pDataCursor->dwLeftLen > 0) { if (!bHasGetTag && !GetTagInfo(pTable->pDataCursor, pTagInfo)) { ProcErrorInfo(pStruData, IOT_NODE_PARAM_INCORRECT, 0, "protocol, $.%d: invalid node, length[%d/%d], internal error[%d].", pTagInfo->wTag, pTagInfo->dwLeftLen, pTable->pDataCursor->dwLeftLen, pTable->pDataCursor->iOffset); return HPR_FALSE; } // 永久标记为没有获取过tag bHasGetTag = HPR_FALSE; // 数组分割符号 if (pTagInfo->byTagType == PARSE_TYPE_ARRAY_OBJECT_SPLIT) { // 已知的非数组节点的后缀字符串不允许存在数组分割符号 if ((dwType == 0) && (eParsingState == kParsingKnownTag)) { ProcErrorInfo(pStruData, IOT_NODE_VALUE_INVALID, 0, "protocol, $.1: invalid data format."); return HPR_FALSE; } if (eParsingState == kParsingKnownArrayNode || eParsingState == kParsingKnownTag) { if (!ParseArrayIncrease(wArrayIdx, pTable, pTagInfo, pStruData)) { return HPR_FALSE; } pTable->eProcessState = kProcessArrayObjectComplete; return HPR_TRUE; } else { // 暂时标记为未识别的分割符号 eParsingState = kParsingUnconfirmedArraySplit; } } else if (pTagInfo->byTagType == PARSE_TYPE_OBJECT_ARRAY_END) { // 已知的非数组节点的后缀字符串不允许存在数组结束符 if ((dwType == 0) && (eParsingState == kParsingKnownTag)) { ProcErrorInfo(pStruData, IOT_NODE_VALUE_INVALID, 0, "protocol, $.2: invalid data format."); return HPR_FALSE; } // 完成单个数组解析 if (eParsingState == kParsingKnownArrayNode || eParsingState == kParsingKnownArrayEnd || eParsingState == kParsingKnownTag) { return ParseArrayEnd(wArrayIdx, pTable, pTagInfo, pStruData); } else { // 保存第一次出现的 if (eParsingState != kParsingUnknownArrayEnd) { tmpDataCursor = *pTable->pDataCursor; } // 暂时标记为未识别的结束符号 eParsingState = kParsingUnknownArrayEnd; } } else { if ((eParsingState != kParsingKnownArrayNode && eParsingState != kParsingUnconfirmedArraySplit) && GetDefinedIdx(pTable->pGroupInfo[0].wGroupTagTable, pTable->pGroupInfo[0].wGroupTagNum, pTagInfo->wTag, &wIdx)) { // 此时解析到special节点跳过 if (!pTagInfo->bySpecial) { pTable->wCurrentGroupID = 0; if(pTable->pDataRef != NULL) pTable->pDataRef[wIdx] = *pTagInfo; eParsingState = kParsingKnownTag; } } else if (GetDefinedArrayIdx(pTable, pTagInfo->wTag, &wArrayIdx, &wIdx)) { // 此时可以确定读到的分隔符为已知数组分隔符 if (eParsingState == kParsingUnconfirmedArraySplit) { if (!ParseArrayIncrease(wArrayIdx, pTable, pTagInfo, pStruData)) { return HPR_FALSE; } pTable->eProcessState = kProcessArrayObjectComplete; return HPR_TRUE; } // 空数组判断 if (pTagInfo->bySpecial && pTagInfo->byTagType == PARSE_TYPE_SPECIAL_TAG && pTagInfo->bySpecValue == pTable->pGroupInfo[wArrayIdx].byLevel) { pTable->pGroupInfo[wArrayIdx].byEmpty = HPR_TRUE; pTable->eProcessState = kProcessArrayObjectEmpty; } else { pTable->pGroupInfo[wArrayIdx].byEmpty = HPR_FALSE; pTable->eProcessState = kProcessArrayObject; } eParsingState = kParsingKnownArrayNode; return HPR_TRUE; } else { // 非协议定义字段直接忽略; 读取未定数组过程中,保持kParsingUnknownArraySplit和kParsingUnknownArrayEnd状态 if ((eParsingState != kParsingUnconfirmedArraySplit) && (eParsingState != kParsingUnknownArrayEnd)) { eParsingState = kParsingUnknownTag; } } } // 偏移到下一个字段, GetTagInfo已经判断长度,此时该接口必然返回HPR_TRUE (void)ConsumeBuffer(pTable->pDataCursor, pTagInfo->dwLeftLen); } // 数组类型数据(dwType == 1),当前解析结束后状态还是为未定数组结束符, // 则确认此时结束符为已知数组结束符(数组结尾包含未知元素节点,外层也包含未知节点时,走该分支) if ((dwType == 1) && (eParsingState == kParsingUnknownArrayEnd)) { // 回溯到首次出现标记的位置 *pTable->pDataCursor = tmpDataCursor; // 处理数组结束逻辑 pTagInfo->wTag = tag_array_end; pTagInfo->byExisted = HPR_TRUE; pTagInfo->byTagType = PARSE_TYPE_OBJECT_ARRAY_END; return ParseArrayEnd(wArrayIdx, pTable, pTagInfo, pStruData); } pTable->eProcessState = kProcessEnd; return HPR_TRUE; }
09-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值