Tag:

静态内联函数是否安全?

场景:我编写了一大段代码,运行在2个并行线程上,这些线程在代码方面是相同的,只是处理不同的数据。 我看到了非确定性的结果。 如果我禁用2个线程中的一个,结果将变为确定性。 在这段代码中我使用了一些静态内联函数(主要原因:它们是我需要的小函数,我只需要在需要它们的翻译单元中复制代码),我想了解它们是否存在可能是我的问题的可能原因。 C中的静态内联函数是否是线程安全的? 反过来说,如果他们内部没有静态变量,但只有一些局部变量和输入参数,那么从2个线程同时调用会导致不可预测的行为吗?

C Pthreads – 线程安全队列实现的问题

我是multithreading的新手,我试图实现一个简单的线程安全任务队列,每个线程可以从中拉出工作,直到没有剩下的任务。 任何线程都不会排队任务。 出于测试目的,每个任务仅包含一个数字。 static pthread_mutex_t task_mutex = PTHREAD_MUTEX_INITIALIZER; typedef struct Task{ int number; }Task; typedef struct Cell{ Task t; struct Cell* next; }Cell; typedef struct TQueue{ struct Cell* head; struct Cell* tail; }TQueue; int empty(TQueue *Queue) return queue->head == queue->tail; void startQueue(TQueue *queue){ queue->head = malloc(sizeof(Cell)); queue->tail = queue->head; } void enqueue(TQueue *queue, Task C){ […]

以线程安全的方式从环形缓冲区复制目标C中的数据

我对这段代码的结果感到困惑: 在一个线程中,我正在写入环形缓冲区(请参阅此处的环形缓冲区的实现): – (void)appendToRingBuffer:(Packet *)packet { int32_t length = ((PacketAudioBuffer *)packet).totalSize; void *writePointer; bytesAvailableToWrite = [ringBuffer lengthAvailableToWriteReturningPointer:&writePointer]; memcpy(writePointer, [((PacketAudioBuffer *)packet).audioBufferData bytes], length); [ringBuffer didWriteLength:length]; //updates ring buffer head pointer } 在另一个线程中,我正在读取它(并将数据复制到NSData变量): -(BOOL)readFromRingBuffer { void *readPointer; allBytesAvailable = [ringBuffer lengthAvailableToReadReturningPointer:&readPointer]; ringBufferReadData = [NSData dataWithBytes:readPointer length:allBytesAvailable]; [ringBuffer didReadLength:allBytesAvailable]; // purges read data from ring buffer // do […]

multithreading – 在arrays中我应该保护什么?

我正在研究一些具有全局数组的代码,可以通过两个线程访问这些代码来读写。 没有批处理会读取或写入一系列索引,所以我试图弄清楚我是应该锁定整个数组还是只锁定我当前正在使用的数组索引。 最简单的解决方案是将数组视为一个CS并对其进行大量锁定,但是我可以避免这种情况并锁定索引吗? 干杯。

线程本地存储开销

假设有一些使用全局变量的不可重入函数: int i; void foo(void){ /* modify i */ } 然后,我想在multithreading代码中使用此函数,因此我可以这样更改代码: void foo(int i){ /* modify i */ } 或者,通过使用gcc __thread说明符,更简单: __thread int i; void foo(void){ /* modify i */ } 最后的优点是我不需要更改另一个调用foo()的代码。 我的问题是,线程本地存储的开销是多少? TLS有一些不明显的问题吗? 如果我将通过单独的指针修改TLS`ed变量,是否有一些开销,如下所示: __thread int i; void foo(void){ int *p = &i; /* modify i using p pointer */ } 谢谢。

您可以在类或结构中使用线程局部变量吗?

像这样。 struct some_struct { // Other fields ….. __thread int tl; } 我试图这样做,但编译器给了我这个错误。 ./cv.h:16:2: error: ‘__thread’ is only allowed on variable declarations __thread int tl;

C标准库线程中的函数是否安全?

我在哪里可以获得明确的答案,我的memcpy (使用Ubuntu附带的eglibc实现)是否是线程安全的? – 老实说,我真的没有在文档中找到明确的YES或NO。 顺便说一句,对于“线程安全”,我的意思是,只要同时复制字节的日期字节是安全的,同时使用memcpy是安全的。 至少在将只读数据复制到不重叠的区域时,这应该是可能的。 理想情况下,我希望在ARM编译器文档中看到本页底部的列表。

C,C ++非同步线程返回奇怪的结果

好的,我有一个关于线程的问题。 有两个未同步的线程同时运行并使用全局资源“int num”1st: void Thread() { int i; for ( i=0 ; i < 100000000; i++ ) { num++; num–; } } 第二: void Thread2() { int j; for ( j=0 ; j < 100000000; j++ ) { num++; num–; } } 问题陈述:程序结束时变量“num”的可能值是什么。 现在我会说0将是程序结束时num的值,但是,尝试运行此代码,你会发现结果是随机的,我不明白为什么? 完整代码: #include #include #include int static num=0; void Thread() { int […]