64,649
社区成员
发帖
与我相关
我的任务
分享
write_thread(){
while(1){
if(write_idx!=read_idx){
memory[write_idx] = random_value;
}else
continue;
if((write_idx +1) == 10)
write_idx = 0;
else
write_idx++;
}
}
read_thread(){
while(1){
if(read_idx!=read_idx){
printf(memory[read_idx]);
}else
continue;
if((read_idx +1) == 10)
read_idx = 0;
else
read_idx++;
}
}
volatile int running = 1, writing = 1, reading = 1;
int write_idx = 0, read_idx = 0, wcnt = 0, rcnt = 0;
class buff {
public:
int state;
char *ptr;
buff(int bufsize) {
state = 0;
ptr = new char[bufsize];
}
~buff() {
delete []ptr;
}
};
buff *memory[10] = {
new buff(255),
new buff(255),
new buff(255),
new buff(255),
new buff(255),
new buff(255),
new buff(255),
new buff(255),
new buff(255),
new buff(255)
};
void write_thread(){
while(running){
while(1) {
if (memory[write_idx]->state==0) break; //找到可写
write_idx = (write_idx+1)%10;
}
wcnt++;
struct timespec tn;
clock_gettime(CLOCK_REALTIME, &tn);
sprintf(memory[write_idx]->ptr, "write-%d:%ld", write_idx, tn.tv_nsec);
printf("%s\n", memory[write_idx]->ptr);
memory[write_idx]->state = 1; //写完修改为可读
write_idx = (write_idx+1)%10;
}
writing = 0;
}
void read_thread(){
while(running){
while(1) {
if (memory[read_idx]->state==1) break; //找到可读
read_idx = (read_idx+1)%10;
}
rcnt++;
printf("read-%d:%s\n", read_idx, memory[read_idx]->ptr);
memory[read_idx]->state = 0; //读完后修改为可写
read_idx = (read_idx+1)%10;
}
reading = 0;
}
int main() {
thread* t1 = new std::thread(&write_thread);
thread* t2 = new std::thread(&read_thread);
this_thread::sleep_for(chrono::milliseconds(10));
running = 0;
while (writing);
while (reading);
for (int i=0; i<10; i++) {
delete memory[i];
}
printf("write_time=%d, read_time=%d\n", wcnt, rcnt);
return 0;
}
if(read_idx!=write_idx){
atomic_int read_idx = 0;
atomic_int write_id = 0;
假设write早一步启动,write_idx先变成1, 启动的时候不会死锁。
write_thread(){
while(1){
if(write_idx!=read_idx){
memory[write_idx] = random_value;
}else
continue;
if((write_idx +1) == 10)
write_idx = 0;
else
write_idx++;
}
}
read_thread(){
while(1){
if(read_idx!=write_idx){
printf(memory[read_idx]);
}else
continue;
if((read_idx +1) == 10)
read_idx = 0;
else
read_idx++;
}
}
你这种方法和锁的道理是一样的,只是有这样的可能,你写的时候刚判断index后,读的线程也在运行,就改变了index的值
你这种方法和锁的道理是一样的,只是有这样的可能,你写的时候刚判断index后,读的线程也在运行,就改变了index的值
你在判断值之后,在下一步代码执行之前,你判断的值就有可能在另一个线程被修改了。
加锁吧,一个简单的例子,这段代码
if(write_idx!=read_idx){
memory[write_idx] = random_value;
}else
判断时候连个index不等,但判断完,赋值之前,另外一个线程有操作,导致连个index相等了,那后面还会你想要的结果么?判断到赋值并不是原子操作
if(write_idx!=read_idx){
memory[write_idx] = random_value;
}else
if(read_idx!=read_idx){