gpt4 book ai didi

Cocoa多线程,锁不起作用

转载 作者:行者123 更新时间:2023-12-03 17:26:51 25 4
gpt4 key购买 nike

我有一个threadMethod,它每0.5秒在控制台robotMotorsStatus中显示一次。但是,当我尝试在 changeRobotStatus 方法中更改 robotMotorsStatus 时,我收到异常。我需要在该程序中放置锁的位置。

#import "AppController.h"

@implementation AppController
extern char *robotMotorsStatus;

- (IBAction)runThread:(id)sender
{
[self performSelectorInBackground:@selector(threadMethod) withObject:nil];
}

- (void)threadMethod
{
char string_to_send[]="QFF001100\r"; //String prepared to the port sending (first inintialization)
string_to_send[7] = robotMotorsStatus[0];
string_to_send[8] = robotMotorsStatus[1];
while(1){
[theLock lock];
usleep(500000);
NSLog (@"Robot status %s", robotMotorsStatus);
[theLock unlock];
}

}

- (IBAction)changeRobotStatus:(id)sender
{
robotMotorsStatus[0]='1';
}

最佳答案

extern char *robotMotorsStatus;

在所显示的任何代码中,您都没有将此指针设置为指向任何位置。 (您是否使用某个机器人包的 SDK 来为您初始化此变量?如果是这样,您能否显示配置设置,告诉它这是要初始化的变量?)

string_to_send[7] = robotMotorsStatus[0];
string_to_send[8] = robotMotorsStatus[1];

如果该 robotMotorsStatus 尚未由 SDK 或未显示的代码初始化,则它们正在随机地址访问内存。如果这使您崩溃,并且这是您提到但没有命名的“异常”,我不会感到惊讶。

robotMotorsStatus[0]='1';

这里有同样的潜在问题。

NSLog (@"Robot status %s", robotMotorsStatus);

这假设 robotMotorsStatus 包含至少一个字符,并且最后一个是零字节(空字符),即 robotMotorsStatus 指向 C字符串。正如我已经指出的,您没有表明 robotMotorsStatus 指向任何东西,即使它确实指向某个地方,您也没有表明该内存的内容是一个 C 字符串。

如果数组的实际边界内不存在空字符,则该数组不包含 C 字符串,并尝试读取整个 C 字符串,就像将数组传递给 %s 格式化程序确实会在超出数组末尾后导致崩溃。如果 robotMotorsStatus 的其他两次访问没有导致您的崩溃,那么这一次可能会导致崩溃。

这里的解决方案不仅是让指针变量指向您想要的某个位置,而且让一个有效的 C 字符串(包括空字符)完全位于该空间内。

顺便说一句,这些问题与线程无关。

关于Cocoa多线程,锁不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2576137/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com