gpt4 book ai didi

c - 单生产者单消费者无锁队列c

转载 作者:太空宇宙 更新时间:2023-11-04 07:33:16 25 4
gpt4 key购买 nike

我想知道为什么以天真的方式实现这种队列是不正确的:

#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <sys/time.h>


void *print_message_function( void *ptr );

void *reader( void *ptr );
void *writer( void *ptr );



int queue[500000];


int main(int argc, char **argv)
{
pthread_t thread1, thread2;

char *message1 = "Thread 1";
char *message2 = "Thread 2";
int iret1, iret2;


iret1 = pthread_create( &thread1, NULL, writer, (void*) message1);
iret2 = pthread_create( &thread2, NULL, reader, (void*) message2);

usleep(2000);

void pthread_exit(void *iret1 );
void pthread_exit(void *iret2 );

exit(0);

}



void *writer( void *ptr )
{
// make local copy of queue head
register int *pos = queue;

// struct thread_param *tp = arg;
int counter = 0;

while(1)
{
//Write to head of queue
*pos = 5;

pos++;

print_message_function( ptr);
}
}


void *reader( void *ptr )
{
int counter = 0;

// make local copy of queue head
register int *pos = queue;

while(1)
{

// Read from tail of queue - loop when nothing
if ( *pos == 5 )
{
print_message_function( ptr );
pos++;
}
}
}



void *print_message_function( void *ptr )
{
char *message;
message = (char *) ptr;
printf("%s \n", message);
}

我确实打算缓存对齐队列。

我不认为内存重新排序是个问题,因为队列头的副本是在开始时创建的,并且只有一个读取器和写入器。

我想要这个的原因是它应该比互斥锁或 CAS 操作更快。

最佳答案

对于 POSIX 线程,如果您使用互斥锁、锁等,您只有在线程之间具有数据一致性。并且一致性与您的编译器没有明确定义的接口(interface)。 (而且 volatile 绝对不是)不要那样做,所有事情都可能发生,因为优化变量的更新(这里 volatile 可能有帮助)或部分读取或写入。

C11,新的C标准有一个线程模型,包括数据一致性模型、线程创建函数和原子操作。似乎没有完全实现此功能的编译器,但 POSIX 线程之上的 gcc 或 clang 实现了您需要的功能。如果您想尝试一下并成为 future 的证明,P99为这些平台实现包装器,允许您使用新的 C11 接口(interface)。

C11 的 _Atomic 类型和操作将是实现线程间操作的无锁队列的正确工具。

关于c - 单生产者单消费者无锁队列c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11377383/

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