Tương tác với 1 đối tượng có kích thước thay đổi như file, mảng với thread

Nếu như tương tác với 1 thằng có kích thước thay đổi như file, mảng (quản lý bởi con trỏ), string, image… mà không lock lại thì dễ ăn hành vì ví dụ thằng này đang copy hoặc duyệt thì thằng khác delete.

Nhưng nếu các biến có kích thước cố định như bool, int, double + volatile… thì có thể bỏ lock không nhỉ ?
Vì có 2 chục cái cờ mà lock/ unlock thấy mệt ghê :frowning:

2 Likes

bool int double gì có std::atomic

ngon lành nè :V https://en.cppreference.com/w/cpp/language/memory_model
image

6 Likes

Ô hay quá mai thử xem sao :slight_smile:
Cảm ơn bác nhiều !

3 Likes

Vậy mấy cái string, mảng cấp phát động… thì có cách nào ngắn hơn cái mutex không bác ?

1 Like

có lẽ là ko :V Mà sửa 1 lúc nhiều cái xài chung 1 mutex được mà

4 Likes

Mình vẫn dung chung 1 mutex nhưng mainthread update giao diện rất nhanh nhưng background code rất dài và lại thực hiện rất chậm nên cứ phải căn ke khi nào lock, unlock nếu không cái giao diện nó giật cà tưng :slight_smile:
Thành ra cứ lock/unlock liên tọi trong background :frowning:

À mình hỏi thêm chút. Ví dụ mình đặt lock/ unlock vào đầu vào cuối một hàm. Hàm này sẽ chạy mất tầm 10s. Nhưng đến giây thứ 9 mình mới sử dung đến biến VAR (ví dụ tên nó thế). Thì ở 9s trước mình có thể truy cập được VAR từ một thread khác không ?.

1 Like

chắc mảng động là mảng pixel? :V còn background code là hiệu ứng hình ảnh gì đó à?

ngu ý là memcpy ra 1 cái mảng khác =] rồi chỉnh sửa ảnh đó, khi xong rồi thì set 1 biến bool nào đó thông báo ảnh đã chỉnh xong và swap lẹ 2 bức hình với nhau là được :V Nếu có thể thì thêm biến float progressPercentage vào để thread giao diện nó hiện progress =]

mà hình như photoshop gì nó cũng chờ vài giây cho 1 hiệu ứng gì mà, có hiện ra từ từ đâu =]

có cái https://en.cppreference.com/w/cpp/thread/condition_variable notify giữa 2 thread được nè

3 Likes

Hiện tại mình đang làm như vậy nhưng không chỉ có 1 ảnh mà rất nhiều thứ khác nữa nên cứ lock, unlock tùm lum. Kiểu là khi cần mới lock, xong cái là unlock luôn. Kiểu kiểu như này:

mutex.lock();
if(!s1){
    mutex.unlock();
    continue;
}
// do something

if(!s2){
    mutex.unlock();
    continue;
}
// do something

// s3,s4,s5...

// end
mutex.unlock();

Dài dữ :smile:

1 Like

lock 1 lần xài s1 tới s5 luôn lock lắc nhắc làm gì :V

2 Likes

Mình tưởng nó lock một phát lock cả cụm luôn tính từ lúc lock.
Chứ vậy là khi nào dung đến thì nó mới thực sự lock sao ?
Vì nếu lock 1 phát mà nó lock cả cụm thì thread khác sẽ đứng hình trong khoảng thời gian giữa lock, unlock mà khoảng này nó lâu lắm.

1 Like

s1 tới s5 thuộc về 5 thread khác nhau à :V

2 Likes

Nó là tài nguyên nhiều thread dung chung đó bác :slight_smile:
Bác có giải pháp gì không ?

1 Like

ko biết nữa, ko rõ program flow thế nào sao chém được =]

1 Like

Mình vừa test, mỗi khi mutex.lock được gọi là tất cả thread khác đứng hình ::))

int intVar = 0;
std::mutex mutex;

void thread1(){
    for(int i=0;i<100000;i++){
        mutex.lock();
        intVar++;
        std::cout<<"T1 : "<< intVar << std::endl;
        mutex.unlock();
        Sleep(100);
    }
}

void thread2(){
    for(int i=0;i<1000;i++){
        mutex.lock();
        Sleep(2000);
        mutex.unlock();
        Sleep(2000);
    }
}



int main(int argc, char *argv[]){
    std::thread t1(thread1);
    std::thread t2(thread2);

    t1.join();
    t2.join();
    return 0;
}
1 Like

hay ra lập thớt khác hỏi đi :V

có cần tới thread pool gì ko? :V s1 tới s5 có thể hiểu là nút bấm on/off? Mỗi cái là 1 job? Nếu vậy thì tạo 1 cái thread pool gồm ví dụ 4 worker thread, rồi khi s[i] on thì đẩy job thứ i vào pool cho nó thực hiện :V thực hiện xong hết rồi thì mới notify cho display thread hiện :thinking:

4 Likes

À s1, s2 là các cờ để người dùng can thiệp vào background bác ạ. Hiểu như cái nút cũng dạng dạng vậy :slight_smile:

2 Likes

vậy là khi job 1 đang thực hiện, người dùng bấm s1 cancel nhưng phải chờ lâu chứ ko ngừng liền được à? :V Cái này chắc bó tay thôi =]

1 Like

Muốn nó ngừng ngay thì phải lock, unlock liên tục đó bác.
Chứ lock cả cụm thì từ thread khác sao thay đổi được s vì nó đang bị lock rồi @@.

1 Like

Thấy code của bác @Duong_Act có vẻ kỳ kỳ.
Mutex là để bảo vệ data, nên chỉ lock khi cần đọc/modify data và unlock ngay sau đó.
Tại sao lại có chuyện, lock rồi unlock dựa theo các cờ s1, s2 gì đó được nhỉ?
Cái bác cần có khi chính là cái condition_variable như bạn @tntxtnt nói ở bên trên á

2 Likes

Thì s1, s2… nó cũng là data đó bạn. Nó cũng được edit chỉnh sửa từ các thread khác.

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?