2010-05-07 32 views
6

Tôi có một ứng dụng sẽ sinh ra nhiều luồng. Tuy nhiên, tôi cảm thấy có thể có một vấn đề với các chủ đề truy cập dữ liệu mà họ không nên. Tôi tương đối mới để luồng quá trần với tôi.Chuyển cấu trúc dữ liệu đến các chủ đề khác nhau

Dưới đây là cấu trúc của ứng dụng ren (xin lỗi vì sự độ thô):

    MainThread 
       /  \ 
       /   \ 
       /   \ 
     Thread A    Thread B 
    /  \   /  \ 
    /  \   /  \ 
    /   \  /   \ 
Thread A_1  Thread A_2 Thread B_1 Thread B_2 

Dưới mỗi chữ chủ đề (mà có thể là nhiều), sẽ chỉ có hai chủ đề và họ đang bị sa thải của tuần tự. Vấn đề tôi đang gặp là tôi không hoàn toàn chắc chắn làm thế nào để vượt qua trong một datastructure vào các chủ đề này.

Vì vậy, datastructure được tạo trong MainThread, sẽ được sửa đổi trong chuỗi ký tự (Thread A, vv) cụ thể cho chuỗi đó và sau đó biến thành viên từ datastructure đó được gửi tới Thread_Numbered.

Hiện tại, lớp chuỗi ký tự có biến thành viên và khi lớp được xây dựng, cấu trúc cơ sở từ mainthread được truyền vào bằng tham chiếu, gọi hàm tạo bản sao sao cho chuỗi ký tự có bản sao riêng để chơi.

Chủ đề được đánh số có chữ cái đơn giản chỉ nhận một biến chuỗi từ cấu trúc dữ liệu trong chuỗi ký tự. Câu hỏi của tôi là, điều này có thể chấp nhận được không? Có cách nào tốt hơn để đảm bảo mỗi chuỗi ký tự có cấu trúc dữ liệu riêng của nó để chơi không?

Xin lỗi vì lời giải thích hơi kém, vui lòng để lại nhận xét và tôi sẽ cố gắng làm rõ.

EDIT: Vì vậy, hàm tạo chuỗi chữ của tôi phải lấy VALUE của cấu trúc dữ liệu, không phải tham chiếu?

+0

Có thể cho chúng tôi biết một chút về những gì bạn muốn đạt được. Tôi là một chút bối rối bởi việc sử dụng hai chủ đề tuần tự - bạn có nghĩa là một bắt đầu khi kết thúc khác? – mdma

+0

+1 cho câu hỏi được khớp nối rõ ràng –

+0

@mdma: bạn có nghĩa là chữ số không? Nếu vậy thì có, chủ đề chữ phát ra từ chữ cái đầu tiên chưa được đánh số, đợi cho đến khi nó được hoàn thành (hoặc lỗi) và kích hoạt chữ cái thứ hai chưa được đánh số. cái đó có giúp ích không? – Robb

Trả lời

5

Tôi sẽ có từng chuỗi tạo bản sao dữ liệu riêng của nó, ví dụ: bạn chuyển cấu trúc trong hàm tạo và sau đó tạo một bản sao cục bộ một cách rõ ràng. Sau đó, bạn được đảm bảo rằng các chủ đề có bản sao riêng biệt. (Bạn nói rằng nó được thông qua bằng cách tham chiếu, và điều này gọi hàm tạo bản sao. Tôi nghĩ bạn có nghĩa là vượt qua bởi giá trị? Tôi cảm thấy nó tốt hơn để rõ ràng làm cho một bản sao, để lại không có nghi ngờ và để làm cho ý định của bạn rõ ràng. đi cùng và thay đổi giá trị của bạn theo giá trị để chuyển qua tham chiếu dưới dạng "tối ưu hóa thông minh".)

EDIT: Đã xóa nhận xét về chuỗi. Vì một lý do nào đó, tôi đã giả định .NET.

Để đảm bảo chuỗi là thuộc sở hữu tư nhân, hãy làm theo cùng một quy trình, tạo bản sao của chuỗi, sau đó bạn có thể sửa đổi tự do.

+0

Hmm, chúng tôi cũng đi qua tham chiếu nhưng nó gọi constructor sao chép và dường như gán biến thành viên đó là bản sao của riêng. Tôi đã không hoàn toàn xác minh nó mặc dù, có thể làm điều đó ngày hôm nay. – Robb

+3

Các chuỗi trong C++ không phải là bất biến. – stonemetal

+0

Ngoài ra, hãy chắc chắn rằng đó là một bản sao sâu để đảm bảo rằng tất cả các dữ liệu là chủ đề địa phương. Nếu bạn có thể thoát khỏi việc không chia sẻ bất kỳ thứ gì giữa các chủ đề, thì đó là cách an toàn nhất và dễ nhất để thực hiện. –

1

Bạn đã xem boost threads chưa? Về cơ bản, bạn sẽ tạo một lớp có thể gọi có một hàm khởi tạo lấy các tham số mà thread đang làm việc và sau đó khởi chạy luồng bằng cách truyền các đối tượng của lớp có thể gọi, được khởi tạo và sẵn sàng để đi.

Điều này rất giống với cách Java thực hiện các chủ đề và nó tạo ra một số lượng tốt ý nghĩa phần lớn thời gian từ một quan điểm thiết kế.

+0

Nhiều như tôi muốn đi tuyến đường tăng cường, dự án hiện đang ở trong một trạng thái mà sẽ đòi hỏi đủ của một viết lại, nơi tôi sẽ bị bắn hạ bởi cấp trên. – Robb

+0

tốt, ngay cả khi tăng không khả dụng - giả sử bạn thoải mái khởi chạy chủ đề qua phương pháp thành viên của đối tượng, mẫu vẫn áp dụng: tạo một lớp chuỗi có: - một hàm tạo yêu cầu tất cả dữ liệu mà thread sẽ cần phải làm việc trên - một phương thức khởi động/chạy hoạt động như điểm nhập chuỗi và vòng xử lý Vì vậy, bạn tạo các thể hiện của đối tượng chuỗi và sau đó khởi động chúng bằng cách truyền các phương thức khởi động/chạy/bất kỳ phương thức nào điểm nhập chủ đề. – sechastain

+0

Vâng, đây thực sự là những gì tôi làm, ngoại trừ việc sử dụng thông qua tham chiếu của cấu trúc dữ liệu. – Robb

3

Có một mẫu gọi là Active Object Pattern trong đó mỗi đối tượng thực thi theo chủ đề riêng của nó. Các khung như ACE hỗ trợ điều này. Nếu bạn có quyền truy cập vào các khung như vậy, bạn nên sử dụng chúng.Trong mọi trường hợp, tôi sẽ tin rằng việc tạo một thể hiện mới của một đối tượng và cho phép nó xuất hiện trong luồng riêng của nó là sạch hơn nhiều khi gọi trình tạo bản sao để tạo một bản sao của đối tượng. Khác xem liệu bạn có thể phù hợp với giải pháp sử dụng Thread Local Storage hay không.

1

Bạn đang tạo bản sao dữ liệu cho mỗi trhead và mọi thứ hoạt động? Sau đó không có vấn đề.

Dưới đây là một vài suy nghĩ thêm:

  • Nếu dữ liệu là chỉ đọc, bạn có thể chia sẻ một cấu trúc duy nhất và mọi thứ sẽ ok, miễn là mỗi đọc là (loại cơ bản) nhỏ và nhanh chóng
  • Nếu dữ liệu cần phải được viết, nhưng "riêng tư" (hoặc chứa) cho mỗi chủ đề, sau đó gửi một bản sao cho mỗi chủ đề (những gì bạn đang làm). Caveat: Tôi cho rằng dữ liệu không quá lớn và một bản sao không ăn nhiều tài nguyên.
  • Nếu dữ liệu cần phải được viết và các giá trị mới được chia sẻ giữa các luồng, thì bạn cần phải suy nghĩ về nó (đọc trên đó) và tạo ra một thiết kế phù hợp. Tôi thích một đối tượng giao dịch để tập trung mỗi chủ đề đọc/ghi hoạt động. Giống như một cơ sở dữ liệu nhỏ trong bộ nhớ. Kiểm tra về mutex thread, semaphores và các phần quan trọng). Xử lý tập dữ liệu khổng lồ Tôi đã sử dụng một cơ sở dữ liệu để tập trung các yêu cầu (Xem ODBM). Bạn cũng có thể kiểm tra các thư viện xếp hàng nhắn tin hiện có (như MSMQ) để thay đổi và đồng bộ hóa dữ liệu.

Hy vọng điều này sẽ hữu ích.

+0

May mắn là cấu trúc dữ liệu sẽ không thực sự được chia sẻ giữa các luồng, trừ các mô tả ở trên. Vì vậy, nếu cấu trúc dữ liệu được chứa trong mỗi luồng (và mỗi luồng có cấu trúc dữ liệu OWN của nó) thì không nên sử dụng nhiều cho mutexes. – Robb

0

Có vẻ như bạn không muốn mỗi luồng hoạt động trên dữ liệu và sau đó ít nhất cũng có một chuỗi khác phản ứng với những gì một luồng khác đã thực hiện đối với công việc của luồng khác trên dữ liệu. Nếu bạn thực sự độc lập có nghĩa là không có chủ đề nào khác thực sự quan tâm đến công việc mà một luồng khác đã làm, thì tôi đề nghị tạo một bản sao dữ liệu, nếu không bạn sẽ muốn làm việc trong một luồng và tạo kết quả đó công việc đó có sẵn cho một chủ đề khác tôi đề nghị bạn, chuyển một tham chiếu/con trỏ tới đối tượng xung quanh và sau đó bảo vệ quyền truy cập vào nó thông qua các khóa để các luồng có thể hoạt động với nó. thực hiện khóa.

Các vấn đề liên quan